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!")
}
をしかし:
関連:http://stackoverflow.com/a/27997724/5475238 –
ありがとうございますが、現時点ではPlaygroundやデバッガでは実動コードではなく、内部で使用されることを意図したReflexion APIを使用しています。さらに、 'reflect'関数は* Swift 3 *では利用できません。 – Zaphod
これはSwiftのような恐ろしいタイプなので、できるだけ限定する必要がある理由の本当に素晴らしい例です(実際には正式な例の1つです)。基本的に、これは「あなたがこれを必要とするならば、間違った道にいる」というケースです。スウィフトはいつも「Any Any」に直面したときに絶えず吹き飛ばされ(「AnyObject」に直面したときにはほんのわずかしかない)、爆発の最も微妙で普及したバージョンの1つは、あなたが期待していなかった種類のもの。 –