注意最后两行:
var optionalString: String? // nil
optionalString == "A" // false
//optionalString! == "A" // EXC_BAD_INSTRUCTION
optionalString = "A" // “A”
optionalString == "A" // true
optionalString! == "A" // true
这是否意味着我们在比较时不需要解开可选值?
最佳答案
这是 ==
运算符的定义,看起来在本例中使用了它:
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
,该文字被包装在一个可选值中以进行类型检查。代码编译并运行。
请注意,这与隐式展开第一个参数完全不同。这不是一个安全的操作,并且会破坏选项的全部意义。
关于swift - 相等运算符是否意味着强制展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774965/