2017-09-26 5 views
0

とここAnyHashableを列挙して鋳造サポートしない単純な場合の例であるSwfit.AnyHashableケーシングされていないと思われます。(!として?,限り)適切に列挙

enum testEnum: String { 
    case Test 
} 

let myObject: AnyHashable = testEnum.Test as AnyHashable 
let newObject = myObject as? testEnum 

この場合、newObjectはnilを返します。代わりにキャストした場合

let newObject = (myObject as? AnyObject) as? testEnum 

キャストしても問題ありません。

私は構造体、カスタムクラスと文字列でこれを試してみましたが、それらはすべて適切にキャスト。たとえば、これは動作します。

let myObject: AnyHashable = "Test" as AnyHashable 
let newObject = myObject as? String 

これは迅速なバグですか、私はちょうどここでこれを正しく実行していませんか?

Iがスイフト3.2スイフト4に

+0

「AnyHashable」ではなく「Any」を使用する必要があります。 btw大文字で始まるあなたのエニュームの名前をスウィフトコンベンションとし、小文字で始まるケース –

答えて

2

AnyHashableexplicitly type-erasesこれを試みた:

AnyHashable型が等価比較を転送し、その特定の基になる型を隠し、基礎となるハッシュ可能値に対する操作をハッシュ。

これはいくつかの型で動作するという事実は、驚くべき事実であり、列挙型では失敗しないということです。私はそれが辞書の助けとなるパフォーマンスの最適化だと思います。しかし、これはあなたがAnyHashableを使用すると予想される方法ではありません。期待される使用法はAnyHashable.initで初期化することであり、as AnyHashableではありません。 AnyHashableAnyまたはAnyObjectより事の全く異なる種類であることを

enum TestEnum: String { 
    case test 
} 

let myObject = AnyHashable(TestEnum.test) 
myObject.base    // => test (as an Any) 
myObject.base as? TestEnum // => Optional<TestEnum>(.test) 

注:

何を意味することは、このです。後者の2つはプロトコルです。前者は型消去構造体です。 STDLIBにおける接頭Any...は(あなたが同じくらい人間的に可能避けなければならないこと)変わり者特殊な場合を除き、「型消しゴム」AnyAnyObjectを意味します。

+0

AnyHashableはタイプを消去するための単なるラッパーです。しかし、私は一貫性のない行動が私を捨てたと思います。私は、いくつかの型(enumを除くすべての型)で動作するという事実に基づいて、使いやすさのためにベースプロパティを無視するという簡潔なサポートがあると仮定しました。 – MurderDev

関連する問題