Swift 快速布尔检查
因此,在Objective-C中,当使用布尔值时,可以并且鼓励使用变量的非零值作为布尔值编写代码,这意味着您可以编写如下代码: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
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
中遇到的问题。就这么简单吗?