相等运算符是否意味着强制展开?

时间:2015-11-18 08:25:28

标签: swift forced-unwrapping

注意最后两行:

var optionalString: String? // nil
optionalString == "A"       // false
//optionalString! == "A"    // EXC_BAD_INSTRUCTION
optionalString = "A"        // “A”
optionalString == "A"       // true
optionalString! == "A"      // true

这是否意味着我们在比较时不需要打开可选项?

2 个答案:

答案 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")
}