2016-09-20 23 views
3

プロトコルへのキャストを使用して、いくつかの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クラスメソッドで働いている理由誰かが私に言うことができれば、私は本当に感謝するだろう。

私は本当に明白な何かを見逃しているように感じます。

+0

異なる名前空間を持つCodeCollectionの2つの異なる定義がありますか? –

+0

私はちょうど持っている。プロトコルだけがその名前を持っています。私は実験していて、構造体VirtualDoor型にキャストしようとすると、うまくいきます。このビューを使って他のタイプのコレクションを表示することはできませんでした。 – vichudson1

+0

実際にはそれは何かです。このプロトコルは、ウォッチキットエクステンションの外にある「共有」フォルダ内のフォルダーに定義されています。私はiOSアプリとWatchKitターゲットボックスの両方をチェックしています。それ以外に、あなたが何を意味するのか、それをどう修正するのかは分かりません。最初に、ターゲット間でコードを共有するようにアプリを作ることに挑戦します。何かアドバイス? – vichudson1

答えて

1

は私だけ別のOptional代わりのCodeCollectionにアンラップされ、暗黙のAny??としてあなたcontextからdoorsを疑います。

awake関数内でlet context = context as AnyObjectを使用している場合は、正しくアンラップする必要があります。

見た目には分かりません。

このプレイグラウンドの最後の2つのコメントは、オプションを保持する場所でプレイする例を示しますが、オプションのタイプは消去されてラップされます。

import Foundation 

protocol Target { 
    var name: String { get } 
} 

func takesAnyOptional(context: Any?) -> String? { 
    return (context as? Target)?.name 
} 

struct Source: Target { 
    let name = "Source" 
} 

let solid = Source() 
print((solid as Target).name) 
takesAnyOptional(context: solid) 

let solid_any = solid as Any 
print((solid_any as? Target)?.name) 
takesAnyOptional(context: solid_any) 
takesAnyOptional(context: solid_any as Any?) 

let solid_anyOpt = solid as Any? 
print((solid_anyOpt as? Target)?.name) 
takesAnyOptional(context: solid_anyOpt) 
takesAnyOptional(context: solid_anyOpt as Any) // -> double optional -> nil 

let solid_anyOpt_any = solid_anyOpt as Any 
takesAnyOptional(context: solid_anyOpt_any) // -> double optional -> nil 
+0

この問題が発生しました。この余分なキャストを追加すると、私にとって問題が解決します。 –

関連する問題