我注意到很多快速构建的内容需要或者返回Int
而不是UInt
s:
以下是Array
的一些示例:
mutating func reserveCapacity(minimumCapacity: Int)
var capacity: Int { get }
init(count: Int, repeatedValue: T)
mutating func removeAtIndex(index: Int) -> T
鉴于该语言是全新的,并且假设这种设计选择并非随意 - 我想知道:为什么swift内置ins需要Int
而不是UInt
s?
一些注意事项:问,因为我自己正在处理一些收藏品,我想知道我应该用什么类型来处理reserveCapacity
等等。我自然期望reserveCapacity
取而代之的是UInt
。
答案 0 :(得分:9)
UInt
是导致错误的常见原因。很容易意外地产生-1并结束无限循环或类似问题。 (许多C和C ++程序员已经学会了你真正应该使用int
的困难方法,除非需要unsigned
。)由于Swift如何管理类型转换,这一点更为重要。如果您曾使用NSUInteger
打开了“签名到无符号”警告(这是Swift中的错误,而不是C中的可选警告),您就知道这是多么痛苦。
Swift编程指南在UInt
:
请注意
仅当您特别需要与平台的本机字大小相同的无符号整数类型时才使用UInt。如果不是这种情况,则优选Int,即使已知要存储的值是非负的。 Int对整数值的一致使用有助于代码互操作性,避免在不同数字类型之间进行转换,并匹配整数类型推断,如类型安全和类型推断中所述。
答案 1 :(得分:1)
这是一个可能的解释(我不是这个主题的专家):假设你有这个代码
let x = 3
test(x)
func test(t: Int) {
}
这将编译没有问题,因为'x'的类型被推断为Int。
但是,如果将功能更改为
func test(t: UInt) {
}
编译器会给你一个构建错误('Int' is not convertible to 'UInt'
)
所以我的猜测是,这只是为了方便,因为Swift的类型安全性会要求你每次都手动转换它们。