注意最后两行:
var optionalString: String? // nil
optionalString == "A" // false
//optionalString! == "A" // EXC_BAD_INSTRUCTION
optionalString = "A" // “A”
optionalString == "A" // true
optionalString! == "A" // true
这是否意味着我们在比较时不需要打开可选项?
答案 0 :(得分:2)
这是==
运算符的定义,看起来在这种情况下使用它:
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
您会看到第一个参数(lhs
)和第二个参数(rhs
)必须属于同一类型T?
。由于第一个参数(optionalString
)是String?
,我认为第二个参数也会转换为String?
,这使得比较有效。
我认为这证明了这个想法:
func testCasting<T: Equatable>(a: T?, b: T?) {
print(a, b) // Optional("A") Optional("A")
}
var optionalString: String? = "A"
testCasting(optionalString, b: "A")
在第二个参数中,您传递一个文字A
,它包含在一个可选项中以进行类型检查。代码编译并运行。
请注意,这与隐式展开第一个参数完全不同。这不是一个安全的操作,会破坏整个选项的重点。
答案 1 :(得分:0)
显然,可以将任何可选项与nil
进行比较。
optionalString == nil
如果可选项现在是nil
,那么这是真的。
即便如此:
if "A" != nil {
print("A")
}