什么是Swift的尺寸方法采用"Int"的理由?

Ben*_*aum 11 swift

我注意到很多快速构建的ins取或返回Ints而不是UInts:

以下是一些示例Array:

mutating func reserveCapacity(minimumCapacity: Int)

var capacity: Int { get }

init(count: Int, repeatedValue: T)

mutating func removeAtIndex(index: Int) -> T
Run Code Online (Sandbox Code Playgroud)

鉴于这种语言是全新的,并且假设这种设计选择不是任意的 - 我想知道:为什么swift构建的ins需要Ints而不是UInts?

一些注意事项:问,因为我工作了几集我自己,我想我应该使用什么类型的东西像reserveCapacity等什么我自然期望是reserveCapacity采取UInt替代.

Rob*_*ier 9

UInt是导致错误的常见原因.很容易意外地产生-1并结束无限循环或类似问题.(许多C和C++程序员已经学会了你真正应该使用的困难方法,int除非有需要unsigned.)由于Swift如何管理类型转换,这一点更为重要.如果您曾经使用NSUInteger过"签名到无符号"警告(这是Swift中的错误,而不是C中的可选警告),您就知道这是多么痛苦.

Swift编程指南在以下部分中解释了它们的具体原理UInt:

注意

仅当您特别需要与平台的本机字大小相同的无符号整数类型时才使用UInt.如果不是这种情况,则优选Int,即使已知要存储的值是非负的.Int对整数值的一致使用有助于代码互操作性,避免在不同数字类型之间进行转换,并匹配整数类型推断,如类型安全和类型推断中所述.

  • 在Swift中,您描述的问题不是问题.你__不能将带负值的int作为UInt传递并进行类型转换.(就像你说的那样,这是Swift中的一个错误). (2认同)

Ato*_*mix 1

这是一个可能的解释(我不是这个主题的专家):假设你有这个代码

let x = 3
test(x)

func test(t: Int) {
}
Run Code Online (Sandbox Code Playgroud)

这将毫无问题地进行编译,因为“x”的类型被推断为 Int。

但是,如果将函数更改为

func test(t: UInt) {
}
Run Code Online (Sandbox Code Playgroud)

编译器会给你一个构建错误('Int' is not convertible to 'UInt'

所以我的猜测是这只是为了方便,因为 Swift 的类型安全性会要求你每次都手动转换它们。

  • 好吧,我不同意;-) 我认为没有类型注释/转换它看起来更干净。 (2认同)