var s = 1 var a: Int = s var b: Int? = s
のaとbが異なるということですね。クラスサブクラス、あるいはExistentialと具体型の関係なら、これは同じものを指すわけです。(Existentialは厳密には異なるが省略) var s = Cat() var a: Animal = s var b: Cat = s
この結果発生する問題として、 実態が異なっているということを知っているユーザーと知らないユーザーとの間で、期待する挙動に差が出てきます。例えば.some(1)
と 1
は別でしょ」っていう理解のユーザーからは、AnyHashableの値が異なることこそが期待される挙動なはずです。var s = Cat() var a: Animal = s // CatとAnimalのサブタイプ関係が成り立つことを示す var b: Cat? = s var c: Animal? = b
U?はT?のサブタイプ、は具体のコードとしては、 UITableViewController?
な変数が UIViewController?
に渡せる、というのが頻出すると思います。 (edited)var s = Cat() var a: Animal = s // CatとAnimalのサブタイプ関係が成り立つことを示す var b: Cat? = .some(s) var c: Animal? = b.map { $0 as Animal }
mapのところは本当は違うと思うんですが、まあ雑にこんな感じ。 (edited)var d: Cat?? = b // b: Cat?
1. オプショナルのサブタイプなので.someでラップする 2. CatはCat?のサブタイプなのだから、.mapでOK
// 1. var d1 = .some(b) // 見たまま.some(.none)になります // 2. var d2 = b.map { $0 as Cat? } // これは.noneになります
じゃあこれがどういう問題を引き起こしたかというと