2016-04-08 7 views
0

[なぜ[HomeADItem]を[ADItem]に変換できないのですか?どうしたの? ]スウィフトプロトコルが機能しない

もし私が@objcでADItemプロトコルをマークするなら、HomeADItemスーパークラスをNSObjectに変更してください。誰が私を助けることができる、事前に感謝!

protocol ADItem { 
    var name: String { get } 
    var id: String { get } 
} 

class ADScrollView: UIView { 
    class func viewWithframe(frame: CGRect, items: [ADItem]) {} 
} 

struct HomeADItem: ADItem { 
    let name: String 
    let id: String 
    init(name: String, id: String) { 
     self.name = name 
     self.id = id 
    } 
} 

let items = [ 
    HomeADItem(name: "test1", id: "1"), 
    HomeADItem(name: "test2", id: "2") 
] 

ADScrollView.viewWithframe(CGRectZero, items: items) 
+0

コードのスニペットを追加してください。ありがとう。 – Ragnar

答えて

3

[HomeADItem]の種類は[ADItem]として自動的に推論されません。明示的な注釈を付けると、問題が解決されます。

let items: [ADItem] = [ 
    HomeADItem(name: "test1", id: "1"), 
    HomeADItem(name: "test2", id: "2") 
] 
ADScrollView.viewWithframe(CGRectZero, items: items) 
+2

スイフトはタイプを推測するのに問題はありません。 'items'は' HomeADItem'オブジェクトを含んでいるので、型は 'HomeADItem'に推論されます。この型が 'ADItem'に準拠しているという事実は、ここではコンパイラとは無関係です。 *準拠*は継承*を意味するものではないので、明示的にキャストする必要があります。 – Pyroh

+0

そうです、それはちょっとした言葉遣いでした。ありがとうございました。 –

+0

@Pyroh私はいつもコンパイラが[ADItem]にアイテムを推論できると思っています、ありがとう –

関連する問題