プロトコルへのキャストを使用した Swift Optional Binding で問題が発生しています。正常に動作するプレイグラウンドに次のコードがあります。
protocol CodeCollection {
var name: String { get }
var codes: [String] { get }
}
struct VirtualDoors: CodeCollection {
var name = "Virtual Doors"
var codes: [String] = ["doorNumba1", "doorNumba2"]
}
// Instance of VirtualDoors
let doors = VirtualDoors()
// cast into Any? like what awake(withContext context: Any?) receives
var context = doors as Any?
print(context)
if let newDoors = context as? CodeCollection {
// Works as expected
print(newDoors)
}
渡された情報の一部としてwatchKitでまったく同じプロトコルと構造体を使用してawake(withContext context: Any?)
いますが、キャストによるオプションのバインディングはそこで失敗しています。
override func awake(withContext context: Any?) {
super.awake(withContext: context)
// Just checking to make sure the expected item is in fact being passed in
print(context)
// "Optional(VirtualDoors(name: "Virtual Doors", codes: ["doorNumba1", "doorNumba2"]))\n"
if let newDoors = context as? CodeCollection {
self.collection = newDoors
print("Context Casting Success")
} else {
// Casting always fails
print("Context Casting Fail")
}
}
なぜこれが遊び場では機能するのに、watchKit クラスメソッドでは機能しないのかを誰かが教えてくれたら、本当にありがたいです。
本当に明白な何かが欠けているように感じます。