2016-07-25 108 views
2

在swift 3.0 Xcode beta 3中,我定義了一個相當簡單的協議和兩個實現它的結構,如果我在創建對象時初始化數組,它會起作用,但如果我嘗試添加元素我收到一個錯誤:Swift Protocol Arrays添加與實例化

Cannot convert value of type '[H]' to expected argument type 'inout _'

不應該這樣做嗎?

protocol H { 
    var v : Int { get set } 
    func hello() 
} 

struct J : H { 
    var v : Int 
    func hello() { 
     print("j") 
    } 
} 

struct K : H { 
    var v : Int 
    func hello() { 
     print("k") 
    } 
} 

let ag:[H] = [K(v:3), J(v:4)] // works 
ag[0].hello() 
ag[1].hello() 

var af:[H] = [] 
af += [K(v:3)] // does not work 
af += [J(v:4)] // does not work 
af[0].hello() 
af[1].hello() 
+0

'變種AF:[H] = []'是更好的寫法如下:'變種AF = [H]() ' – Alexander

回答

3

這是一個類型問題。你需要添加到af的事情是相同類型af,即[H]

var af:[H] = [] 
let arr1:[H] = [K(v:3)] 
let arr2:[H] = [J(v:4)] 
af += arr1 
af += arr2 
+0

感謝解決了它,但它看起來不自然:這也適用於var af:[H] = [] let w:H = K(v:3) let x:H = J(v:3) af + = [w] af + = [x] af [0] .hello() af [1] .hello() – possen

+0

「看起來不自然」當然,我只是證明這是問題展開我們有明確的類型。你並沒有要求我爲你編寫華麗的代碼,你問編譯錯誤是什麼意思,是什麼原因造成的。我告訴過你。 (不管怎麼樣,你做的事情從一開始就是不自然的,因爲一系列協議不是真正的類型,很快就會讓你陷入困境。) – matt

+0

不要誤解我的意思我很感激幫助。好吧,我猜,我可以預料到會有更多的麻煩,感謝警告。 – possen