什么';这是Swift的基本原理';s大小方法取'Int's?
我注意到许多swift内置程序接受或返回什么';这是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
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,除非有有效的原因,如表示位模式。。。特别是,不要使用无符号类型来表示数字永远不会是负数。谷歌风格指南的链接已经过时。这是一个新的链接: