2016-10-11 13 views
3

これはいくつかの奇妙な振る舞いです。私はタイプがAnyであり、プロトコルの適合をオンにしたいとします。実際のタイプの値はオプションですが、作品:動作が異なっている理由Swift 3プロトコルキャストオンany任意の値を含む

let something: Int? = 42 

switch something { 
case let x as Equatable: print("Yeepee! The answer is \(x)") // Here's what is matched 
default: print("Boohoo!") 
} 

let anything: Any = something // anything contains a Int? value 

switch anything { 
case let x as Equatable: print("Yeepee! The answer is \(x)") 
default: print("Boohoo!") // Here's what is matched 
} 

まず私は単にそれがオプションだ場合でも、その後、どのように私は第二のスイッチ試合正しく値にすることができ、理解していませんか?

ありがとうございます。誰かが持っている場合

func forceUnwrap(any:Any) -> Any { 
    let mirror = Mirror(reflecting: any) 

    if mirror.displayStyle != .optional { 
     return any 
    } 

    if mirror.children.count == 0 { 
     return NSNull() 
    } 

    let (_, some) = mirror.children.first! 

    return forceUnwrap(any: some) 
} 

switch forceUnwrap(any:anything) { 
case let x as Equatable: print("Yeepee! \(x)") 
default: print("Boohoo!") 
} 

をしかし:

+0

関連:http://stackoverflow.com/a/27997724/5475238 –

+0

ありがとうございますが、現時点ではPlaygroundやデバッガでは実動コードではなく、内部で使用されることを意図したReflexion APIを使用しています。さらに、 'reflect'関数は* Swift 3 *では利用できません。 – Zaphod

+1

これはSwiftのような恐ろしいタイプなので、できるだけ限定する必要がある理由の本当に素晴らしい例です(実際には正式な例の1つです)。基本的に、これは「あなたがこれを必要とするならば、間違った道にいる」というケースです。スウィフトはいつも「Any Any」に直面したときに絶えず吹き飛ばされ(「AnyObject」に直面したときにはほんのわずかしかない)、爆発の最も微妙で普及したバージョンの1つは、あなたが期待していなかった種類のもの。 –

答えて

0

おかげで、私はこの解決策を考え出した、@Shadowするが、私が言ったように、それはプレイグラウンドやデバッガの生産のために意図されていない反射のAPIを使用していますが、より多くのソリューション reflexion APIを使用すると、私は感謝しています。

関連する問題