1. ホーム
  2. swift

[解決済み] Swift: switch ケースでオプションの値に対するテストを行う

2022-11-28 13:31:10

質問

Swift では、どのように switch 文のケースを書けば、切り替えられる値を 任意 を含む場合、ケースをスキップします。 nil ?

このようなイメージです。

let someValue = 5
let someOptional: Int? = nil

switch someValue {
case someOptional:
    // someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
    // either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}

この通りに書くと、コンパイラーは someOptional がアンラップされていないと文句を言われますが、明示的にアンラップするために ! を末尾につけて明示的にアンラップすると、もちろん someOptional が含まれていると nil . 追加する ? の代わりに ! は、(オプショナルチェイニングの精神に則り)私にはいくらか意味がありますが、コンパイラーエラーが消えるわけではありません(つまり、実際にオプショナルをアンラップするわけではないのです)。

どのように解決するのですか?

オプショナルは、単に enum のようなものです。

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case none
    case some(T)

    // ...
}

ということで、通常通りマッチングさせることができます。 "関連する値" というマッチングパターンがあります。

let someValue = 5
let someOptional: Int? = nil

switch someOptional {
case .some(someValue):
    println("the value is \(someValue)")
case .some(let val):
    println("the value is \(val)")
default:
    println("nil")
}

からのマッチが必要な場合 someValue にマッチさせたい場合は ガード式 :

switch someValue {
case let val where val == someOptional:
    println(someValue)
default:
    break
}

そしてSwift >2.0のために

switch someValue {
case let val where val == someOptional:
    print("matched")
default:
    print("didn't match; default")        
}