2

注意最后两行:

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

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

4

2 回答 2

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被包装在一个可选项中以进行类型检查。代码编译并运行。

请注意,这与隐式展开第一个参数完全不同。那将不是一个安全的操作,并且会破坏选项的全部意义。

于 2015-11-18T08:39:55.227 回答
0

显然,可以将任何可选内容与nil.

optionalString == nil

如果现在是可选的,这是正确的nil

即使这样也有效:

if "A" != nil {
   print("A")
}
于 2015-11-18T09:02:25.830 回答