2016-07-25 5 views
2

In Swift 3.0 Xcode Beta 3 habe ich ein ziemlich einfaches Protokoll und zwei Strukturen definiert, die es implementieren, wenn ich das Array beim Erstellen der Objekte initialisieren, funktioniert es, aber wenn ich versuche, Elemente hinzuzufügen Ich erhalte einen Fehler:Swift Protocol Arrays Hinzufügen vs. Instanisieren

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

Sollte das nicht funktionieren?

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

'var af: [H] = []' wird besser geschrieben als: 'var af = [H]() ' – Alexander

Antwort

3

Es ist eine Art Problem. Sie müssen die Dinge, die Sie af fügen Sie den gleichen Typ wie af sein, nämlich [H]:

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

Danke, dass es löst, aber es scheint unnatürlich: Dies funktioniert auch var af: [H] = [] Lassen Sie w: H = K (v: 3) Lassen Sie x: H = J (v: 3) af + = [w] af + [x] af [0] .hello() af [1] .hello() – possen

+0

"Es scheint unnatürlich" Sicher, ich beweise gerade, dass das Problem damit ist, es so abzurollen dass wir explizite Typen haben. Sie haben mich nicht darum gebeten, für Sie großartigen Code zu schreiben, Sie haben gefragt, was der Kompilierungsfehler bedeutet und was ihn verursacht. Ich hab es dir gesagt. (Wie auch immer, was Sie tun, ist von Anfang an unnatürlich, weil eine Reihe von Protokollen kein echter Typ ist und Sie bald in Schwierigkeiten bringen wird.) – matt

+0

Versteh mich nicht falsch, ich schätze die Hilfe. OK, ich schätze, ich kann mehr Ärger auf der Straße erwarten, danke für die Warnung. – possen