2

最後の 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最初の引数 ( ) と 2 番目の引数 ( )の両方がrhs同じ型でなければならないことがわかりT?ます。最初の引数 ( optionalString) がString?であるため、2 番目の引数も にキャストされていると思いますString?。これにより、比較が機能します。

これはその考えを証明していると思います:

func testCasting<T: Equatable>(a: T?, b: T?) {
    print(a, b) // Optional("A") Optional("A")
}

var optionalString: String? = "A"
testCasting(optionalString, b: "A")

A2 番目の引数では、型をチェックするためにオプションでラップされるリテラルを渡します。コードがコンパイルされて実行されます。

これは、最初の引数を暗黙的にアンラップすることとはまったく異なることに注意してください。それは安全な操作ではなく、オプションの要点全体を損なうことになります。

于 2015-11-18T08:39:55.227 に答える
0

どうやら任意のオプションを と比較できますnil

optionalString == nil

オプションがnil現在の場合、これは当てはまります。

これでも機能します:

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