【发布时间】:2014-08-02 13:20:21
【问题描述】:
这是一个关于 Swift 编程风格的问题,特别是 Int 与 UInt。
Swift 编程语言指南建议程序员使用通用有符号整数类型Int,即使已知变量为非负数也是如此。来自the guide:
仅当您特别需要与平台的本机字长相同大小的无符号整数类型时才使用 UInt。如果不是这种情况,则首选 Int,即使要存储的值已知为非负数。对整数值一致使用 Int 有助于代码互操作性,避免在不同数字类型之间进行转换,并匹配整数类型推断,如类型安全和类型推断中所述。
但是,UInt 在 32 位架构上是 32 位无符号的,而在 64 位架构上是 64 位无符号的,因此使用 Int 而不是 UInt 没有性能优势。
相比之下,Swift 指南给出了一个后面的例子:
让年龄 = -3
assert(age >= 0, "一个人的年龄不能小于零")
// 这会触发断言,因为年龄不是 >= 0
这里,运行时问题可能会在编译时被发现,如果代码被写成:
let age:UInt = -3
// this causes a compiler error because -3 is negative
还有许多其他情况(例如任何将索引集合的东西)使用UInt 会在编译时而不是运行时发现问题。
所以问题是:Swift 编程语言指南中的建议是否合理,并且使用Int 的好处“即使已知要存储的值是非负数”超过使用 @ 的安全优势987654331@?
附加说明: 使用 Swift 几个星期后,很明显需要与 Cocoa UInt 进行互操作。例如,AVFoundation 框架在任何需要“计数”的地方使用无符号整数(样本数/帧数/通道数等)。将这些值转换为Int 可能会导致值大于Int.max 的严重错误
【问题讨论】:
-
这当然取决于你认为什么重要。我倾向于同意文档,它只是使代码更易于使用
int -
@JackJames 我同意这是个人开发人员的优先级和正在处理的代码的问题。我没有看到任何令人信服的案例,这让我认为 Apple 不应该建议人们不要使用 UInt,因为严格坚持使用 Int 可能会导致代码以各种令人讨厌的方式中断。
-
在 C 中不鼓励使用无符号整数的传统原因是向下计数的
for循环很容易出错;例如for (unsigned a = 10; a > 0; --a)是错误的,因为根据定义,a总是 > 0。 -
同意杰克和杰米的观点。将 UInt 用于已知的非负值会将意图和语义信息传达给下一个阅读代码的开发人员。如果您优先考虑互操作性,那么您可能会选择 Int。
-
@alastair
unsigned a并不总是 > 0 它是 >= 0
标签: types coding-style swift type-safety