Swift布尔检查

Zie*_*ter 6 boolean swift

所以在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)

这里更好地解释为什么检查布尔值与另一个布尔值的原因,但简单地说,问题只是当你比较等式YESNO直接比较时,你实际上分别比较10.由于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中是否存在可以防止这些问题的内容?

Kam*_*xom 2

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是一种类型,可以是truefalse。不要将其视为数字10,而应将其视为开/关对/错。

现在这个协议可以符合你想要的任何名义类型,例如:

extension Int : BooleanType {
    public var boolValue : Bool {
        return self > 0
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你这样做(老实说你不应该这样做),你就自己定义了“真”和“假”的含义。现在您可以像这样使用它(再次强调,不要这样做):

if 0 {
    ...
}
Run Code Online (Sandbox Code Playgroud)