Swift编程语言指南建议程序员使用通用有符号整数类型Int,即使变量已知为非负数。从the guide:
Use UInt only when you specifically need an unsigned integer type with the same size as the platform’s native word size. If this is not the case,Int is preferred,even when the values to be stored are known to be non-negative. A consistent use of Int for integer values aids code interoperability,avoids the need to convert between different number types,and matches integer type inference,as described in Type Safety and Type Inference.
但是,UInt在32位体系结构上为32位无符号,在64位体系结构上为64位无符号,因此使用Int over UInt没有性能优势。
相反,Swift指南给出了一个后面的例子:
let age = -3
assert(age >= 0,“A person’s age cannot be less than zero”)
// this causes the assertion to trigger,because age is not >= 0
这里,如果代码被写为:在编译时可能会捕获运行时问题:
let age:UInt = -3 // this causes a compiler error because -3 is negative
还有许多其他情况(例如任何将索引集合的地方),其中使用UInt在编译时捕获问题,而不是运行时。
所以问题是:在Swift编程语言指南声音,并做的好处使用Int“即使被存储的值是已知的非负”超过使用UInt的安全优势吗?
额外的注意:使用了Swift几个星期,现在清楚的是与Cocoa UInt的互操作性是必需的。例如,AVFoundation框架在需要“计数”(样本数/帧/通道等)的任何地方使用无符号整数。将这些值转换为Int可能导致严重的错误,其中值大于Int.max
let age:UInt = -3
导致编译器错误。我也试过:
let myAge:Int = 1 let age:UInt = UInt(myAge) - 3
这也导致编译器错误。然而,以下(在我看来在实际程序中更常见)方案没有编译器错误,但实际上导致EXC_BAD_INSTRUCTION的运行时错误:
func sub10(num: Int) -> UInt { return UInt(num - 10) //Runtime error when num < 10 } sub10(4)
以及:
class A { var aboveZero:UInt init() { aboveZero = 1 } } let a = A() a.aboveZero = a.aboveZero - 10 //Runtime error
如果这些是纯Ints,而不是崩溃,你可以添加代码来检查你的条件:
if a.aboveZero > 0 { //Do your thing } else { //Handle bad data }
我甚至可以把他们的建议等同于他们的建议反对使用UInts他们的建议反对使用隐式解包可选:不要这样做,除非你确定你不会得到任何负面因为否则你会得到运行时错误(除了在最简单的情况)。