プロトコルへのキャストを使用して、いくつかのSwiftオプションバインディングに問題があります。私はうまく動作する以下のコードを遊び場に持っています。私はawake(withContext context: Any?)
に渡された情報の一部とキャストが失敗していると、オプションの結合としてwatchKitでまったく同じプロトコルと構造体を使用していAny Casting of Any Any?オプションのバインディング中に迅速にプロトコルに変換する
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)
}
。
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クラスメソッドで働いている理由誰かが私に言うことができれば、私は本当に感謝するだろう。
私は本当に明白な何かを見逃しているように感じます。
異なる名前空間を持つCodeCollectionの2つの異なる定義がありますか? –
私はちょうど持っている。プロトコルだけがその名前を持っています。私は実験していて、構造体VirtualDoor型にキャストしようとすると、うまくいきます。このビューを使って他のタイプのコレクションを表示することはできませんでした。 – vichudson1
実際にはそれは何かです。このプロトコルは、ウォッチキットエクステンションの外にある「共有」フォルダ内のフォルダーに定義されています。私はiOSアプリとWatchKitターゲットボックスの両方をチェックしています。それ以外に、あなたが何を意味するのか、それをどう修正するのかは分かりません。最初に、ターゲット間でコードを共有するようにアプリを作ることに挑戦します。何かアドバイス? – vichudson1