什么';这是Swift的基本原理';s大小方法取'Int's?

什么';这是Swift的基本原理';s大小方法取'Int's?,swift,Swift,我注意到许多swift内置程序接受或返回Ints而不是UInts: 以下是数组中的一些示例: mutating func reserveCapacity(minimumCapacity: Int) var capacity: Int { get } init(count: Int, repeatedValue: T) mutating func removeAtIndex(index: Int) -> T 考虑到该语言是全新的,并且假设这种设计选择不是随意的——我想知道:为什么sw

我注意到许多swift内置程序接受或返回
Int
s而不是
UInt
s:

以下是
数组中的一些示例:

mutating func reserveCapacity(minimumCapacity: Int)

var capacity: Int { get }

init(count: Int, repeatedValue: T)

mutating func removeAtIndex(index: Int) -> T
考虑到该语言是全新的,并且假设这种设计选择不是随意的——我想知道:为什么swift内置采用
Int
s而不是
UInt
s?

一些注意事项:询问是因为我自己正在处理一些集合,我想知道我应该使用什么类型的集合,比如
reserveCapacity
等。我自然希望
reserveCapacity
取而代之的是
UInt

以下是一个可能的解释(我不是这方面的专家):假设您有此代码

let x = 3
test(x)

func test(t: Int) {
}
这将毫无问题地编译,因为“x”的类型被推断为Int

但是,如果将函数更改为

func test(t: UInt) {
}
编译器将给您一个生成错误(
'Int'不能转换为'UInt'


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

UInt
是常见的错误原因。很容易意外地生成a-1,并最终导致无限循环或类似问题。(许多C和C++程序员已经学会了,你真的应该只使用<代码> int <代码>,除非有需要<代码>无符号< /代码>。因为SWIFT管理类型转换,这更重要。如果您曾经使用过
NSUInteger
并打开了“signed to unsigned”警告(这是Swift中的一个错误,而不是像C中那样的可选警告),您知道这是多么痛苦

Swift编程指南在
UInt
一节中解释了它们的具体原理:

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


对于它的价值,但这是一个相当疯狂的猜测,并且做
让x:UInt=3
将修复它或
测试(UInt(x))
。两者似乎都更“敏捷”,我不同意;-)我认为没有类型注释/转换,它看起来更干净。特别是,
UInt(x)
甚至可能不可能。它可能会失败。你每次使用它时都需要考虑这个问题。如果您使用
x:UInt
,那么如果您需要将其传递给使用
Int
的对象,则会出现相同的问题。想象一下,
x
scale
,可能同时适用于积极或消极的情况,包括只应该是积极的情况。你进入了一个触发器,在
Int
UInt
之间切换你的
scale
常数,试图得到一个更经常是你想要的(或者你创建了两个更难看的常数)。(顺便说一句,这个例子来自我实际的Swift代码。我开始尝试使用
UInt
来表示“不能是负数”很快就明白了为什么这不是一个好主意,然后发现苹果也提到了不要这么做。)在Swift中,你所描述的问题不是问题。不能将带有负值的int作为UInt传递并将其转换为type。(就像你说的,这是Swift中的一个错误)。没错。因此,您常常不得不执行
UInt(x)+y
以将其保留在
UInt
空间中。例如,如果您创建一个常量,它会将推断键入一个
Int
,因此您必须强制转换它。如果您处理的是返回
Int
(很多事情都是这样)的任何东西,那么您必须强制转换它。铸造变得非常过度,你不再关注铸造是否真正安全;不能总是将int转换为unsigned,反之亦然。当你在“X”中的非常常见的未签名的bug中,这是一个从C、Objc和C++中很难学到的类似问题的教程。Swift试图避开这个常见的bug。请参阅谷歌C++风格指南,其中有许多地方推荐SWIFT的前任相同的行为:您不应该使用无符号整数类型,如uint32\u t,除非有有效的原因,如表示位模式。。。特别是,不要使用无符号类型来表示数字永远不会是负数。谷歌风格指南的链接已经过时。这是一个新的链接: