类型 – 为什么Swift语言指南建议使用Int“即使值已知为非负数”吗?

前端之家收集整理的这篇文章主要介绍了类型 – 为什么Swift语言指南建议使用Int“即使值已知为非负数”吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个关于Swift中的编程风格的问题,特别是Int vs UInt。

Swift编程语言指南建议程序员使用通用有符号整数类型Int,即使变量已知为非负数。从the guide

Use UInt only when you specifically need an unsigned integer type with the same size as the platform’s native word size. If this is not the case,Int is preferred,even when the values to be stored are known to be non-negative. A consistent use of Int for integer values aids code interoperability,avoids the need to convert between different number types,and matches integer type inference,as described in Type Safety and Type Inference.

但是,UInt在32位体系结构上为32位无符号,在64位体系结构上为64位无符号,因此使用Int over UInt没有性能优势。

相反,Swift指南给出了一个后面的例子:

let age = -3
assert(age >= 0,“A person’s age cannot be less than zero”)
// this causes the assertion to trigger,because age is not >= 0

这里,如果代码被写为:在编译时可能会捕获运行时问题:

let age:UInt = -3  
// this causes a compiler error because -3 is negative

还有许多其他情况(例如任何将索引集合的地方),其中使用UInt在编译时捕获问题,而不是运行时。

所以问题是:在Swift编程语言指南声音,并做的好处使用Int“即使被存储的值是已知的非负”超过使用UInt的安全优势吗?

额外的注意:使用了Swift几个星期,现在清楚的是与Cocoa UInt的互操作性是必需的。例如,AVFoundation框架在需要“计数”(样本数/帧/通道等)的任何地方使用无符号整数。将这些值转换为Int可能导致严重的错误,其中值大于Int.max

我不认为使用UInt是安全的,你认为它是。正如你所说:
let age:UInt = -3

导致编译器错误。我也试过:

let myAge:Int = 1
let age:UInt = UInt(myAge) - 3

这也导致编译器错误。然而,以下(在我看来在实际程序中更常见)方案没有编译器错误,但实际上导致EXC_BAD_INSTRUCTION的运行时错误

func sub10(num: Int) -> UInt {
    return UInt(num - 10) //Runtime error when num < 10
}
sub10(4)

以及:

class A {
    var aboveZero:UInt
    init() { aboveZero = 1 }
}
let a = A()
a.aboveZero = a.aboveZero - 10 //Runtime error

如果这些是纯Ints,而不是崩溃,你可以添加代码来检查你的条件:

if a.aboveZero > 0 {
    //Do your thing
} else {
    //Handle bad data
}

我甚至可以把他们的建议等同于他们的建议反对使用UInts他们的建议反对使用隐式解包可选:不要这样做,除非你确定你不会得到任何负面因为否则你会得到运行时错误(除了在最简单的情况)。

猜你在找的Swift相关文章