所以在Objective-C中使用布尔值时,可以并且鼓励使用变量的非零值来编写代码,因为它是布尔值,这意味着您可以编写如下代码:
if (someBool) {
// Stuff
}
Run Code Online (Sandbox Code Playgroud)
此外,有理由不鼓励使用以下代码:
if (someBool == YES) {
// Might run into problems here
}
Run Code Online (Sandbox Code Playgroud)
这里更好地解释了为什么检查布尔值与另一个布尔值的原因,但简单地说,问题只是当你比较等式YES或NO直接比较时,你实际上分别比较1和0.由于Objective-C允许使用非零值作为真值,因此您最终可能会比较应被视为真实的内容YES并将表达式解析为NO,例如
int trueNumber = 2;
if (trueNumber == YES) {
// Doesn't run because trueNumber != 1
}
Run Code Online (Sandbox Code Playgroud)
这仍然是Swift中的一个问题吗?抛开代码风格问题,如果我看到类似以下的内容
var someBool = true
if someBool == true {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
这会成为一个问题,还是不重要?这些C风格的比较是否仍然在幕后发生,或者Swift BooleanType中是否存在可以防止这些问题的内容?
Swift 中的结构if <something> {}要求<something>符合BooleanType如下定义的协议:
public protocol BooleanType {
/// The value of `self`, expressed as a `Bool`.
public var boolValue: Bool { get }
}
Run Code Online (Sandbox Code Playgroud)
如果类型不符合此协议,则会引发编译时错误。如果您在标准库中搜索此协议,您会发现唯一符合此协议的类型是Bool其本身。Bool是一种类型,可以是true或false。不要将其视为数字1或0,而应将其视为开/关对/错。
现在这个协议可以符合你想要的任何名义类型,例如:
extension Int : BooleanType {
public var boolValue : Bool {
return self > 0
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你这样做(老实说你不应该这样做),你就自己定义了“真”和“假”的含义。现在您可以像这样使用它(再次强调,不要这样做):
if 0 {
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |