Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速布尔检查_Swift_Boolean - Fatal编程技术网

Swift 快速布尔检查

Swift 快速布尔检查,swift,boolean,Swift,Boolean,因此,在Objective-C中,当使用布尔值时,可以并且鼓励使用变量的非零值作为布尔值编写代码,这意味着您可以编写如下代码: if (someBool) { // Stuff } public protocol BooleanType { /// The value of `self`, expressed as a `Bool`. public var boolValue: Bool { get } } 此外,不鼓励使用以下代码还有一些原因: if (someBo

因此,在Objective-C中,当使用布尔值时,可以并且鼓励使用变量的非零值作为布尔值编写代码,这意味着您可以编写如下代码:

if (someBool) {
    // Stuff
}
public protocol BooleanType {
    /// The value of `self`, expressed as a `Bool`.
    public var boolValue: Bool { get }
}
此外,不鼓励使用以下代码还有一些原因:

if (someBool == YES) {
    // Might run into problems here
}
将一个布尔值与另一个布尔值进行比较的原因得到了更好的解释,但简单地说,问题在于,当您直接将相等值与
YES
NO
进行比较时,实际上分别与
1
0
进行比较。由于Objective-C允许使用非零值作为真值,因此您可以将应视为真的内容与
YES
进行比较,并将表达式解析为
NO
,例如

int trueNumber = 2;
if (trueNumber == YES) {
    // Doesn't run because trueNumber != 1
}
这在Swift中仍然是一个问题吗?撇开代码风格问题不谈,如果我看到如下内容

var someBool = true
if someBool == true {
    // stuff
}

这是一个问题,还是真的无关紧要?这些C风格的比较是否仍在幕后进行,或者Swift BooleanType中是否内置了某种东西来防止这些问题?

Swift有Bool类型。这与objective-c的BOOL不同,后者不是实际类型。它实际上是typedef unsigned char。当swift期望Bool时,您必须给它Bool,否则它就是编译错误。以下代码将不会编译,因为check不是Bool

let check = 2
if check {
}
但这会起作用,因为==返回Bool

let check = 2
if check == 2 {
}
Swift中的
if{}
结构要求
符合
布尔类型
协议,该协议定义如下:

if (someBool) {
    // Stuff
}
public protocol BooleanType {
    /// The value of `self`, expressed as a `Bool`.
    public var boolValue: Bool { get }
}
如果类型不符合此协议,则抛出编译时错误。如果在标准库中搜索此协议,您会发现符合此协议的唯一类型是
Bool
本身
Bool
类型可以是
true
false
。不要把它看作是数字
1
0
,而是开/关对/错

现在,您可以通过任何您想要的标称类型来遵守该协议,例如:

extension Int : BooleanType {
    public var boolValue : Bool {
        return self > 0
    }
}
现在,如果你这样做(你不应该诚实地说),你就是在自己定义“真”和“假”的含义。现在,您可以这样使用它(同样,不要这样做):


要理解ObjC样式,您需要回到C。在C中,以下语句:

if (something) {
    // Do something
}
如果
某物
为null或0,则将计算为
false
。其他所有内容的计算结果均为
true
。问题是C没有布尔类型。目标C增加了
YES
NO
,基本上是1和0。因此:

if (aBoolValue == YES) { } // Work as expected
if (anIntValue == YES) { } // False unless anIntValue == 1
“不鼓励”的建议是与C中的行为保持一致。Swift没有此类向后兼容性要求。你不能写这些:

if anIntValue {  } // Syntax error
if anObject { }    // Syntax error
相反,表达式的计算结果必须为布尔值:

if anIntValue != 0 { } // Ok
if anObject != nil { } // Ok

实际上,
Bool
在Swift中是它自己的类型,而不是“unsigned char”(在Swift中是
CUnsignedChar
)的类型别名。对不起,我是说Objective-C不是Swift好的,它在Objective-C中更复杂,比较一下。好的,因此,Objective-C中出现问题的代码之所以不是问题,仅仅是因为Swift中严格的类型检查?似乎为了在Swift中用于布尔检查,类型基本上必须返回严格类型的
Bool
(如上所示),这避免了C和Objective-C在
typedef signed char
中遇到的问题。就这么简单吗?