这是一个关于Swift编程风格的问题,特别是Int vs UInt 。 Swift编程语言指南build议程序员使用generics有符号整数typesInt即使variables已知是非负数。 从指南 : 只有当您特别需要一个与平台的本机字大小相同的无符号整数types时才使用UInt。 如果不是这种情况,则即使要存储的值已知为非负数,Int也是优选的。 Int一致地使用整数值有助于代码的互操作性,避免了在不同数字types之间转换的需要,并匹配整数types推断,如types安全和types推断中所述。 但是, UInt在32位体系结构上是32位无符号的,在64位体系结构上是64位无符号的,所以在UInt上使用Int没有性能优势。 相比之下,Swift指南给出了后面的例子: 让年龄= -3 断言(年龄> = 0,“一个人的年龄不能小于零”) //这会导致断言触发,因为年龄不是> = 0 在这里,如果代码被写为: 编译时会遇到运行时问题。 let age:UInt = -3 // this causes a compiler error because -3 is negative 还有很多其他的情况(例如任何索引集合的东西),在使用UInt会在编译时而不是运行时遇到问题。 所以问题是:Swift编程语言指南中的build议听起来是这样的,使用Int的好处是“即使要存储的值是非负的”也超过了使用UInt的安全优势? 附加说明:已经使用Swift几个星期了,现在明确要求与Cocoa UInt互操作性。 例如, AVFoundation框架在任何需要“计数”的位置使用无符号整数(样本数/帧/通道数等)。 将这些值转换为Int可能会导致严重的错误,其值大于Int.max
有没有办法使C更加了解types并确保types安全? 考虑一下: typedef unsigned cent_t; typedef unsigned dollar_t; #define DOLLAR_2_CENT(dollar) ((cent_t)(100*(dollar))) void calc(cent_t amount) { // expecting 'amount' to semantically represents cents… } int main(int argc, char* argv[]) { dollar_t amount = 50; calc(DOLLAR_2_CENT(amount)); // ok calc(amount); // raise warning return 0; } 有没有办法让上面的代码至less提醒gcc的警告? 我知道我可以使用C结构来包装unsigned s,并达到预期的结果,我只是想知道是否有一个更优雅的方式来做到这一点。 它可以比这更多一点吗?