类型 – 为什么Swift语言指南建议使用Int“即使值已知为非负数”
这是一个关于Swift中的编程风格的问题,特别是Int vs UInt。
Swift编程语言指南建议程序员使用通用有符号整数类型Int,即使变量已知为非负数。从the guide:
但是,UInt在32位体系结构上为32位无符号,在64位体系结构上为64位无符号,因此使用Int over UInt没有性能优势。 相反,Swift指南给出了一个后面的例子:
这里,如果代码被写为:在编译时可能会捕获运行时问题: 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他们的建议反对使用隐式解包可选:不要这样做,除非你确定你不会得到任何负面因为否则你会得到运行时错误(除了在最简单的情况)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |