2016-04-30 2 views
9

ich offiziell bin verwirrt, warum dies nicht funktioniert (es gibt nicht viel, hier zu erklären):Swift 2.2: kann nicht Wert vom Typ umwandeln ‚[B]‘ zu bestimmtem Typ ‚[A]‘

protocol A { 

    var value: Int { get set } 
} 

struct B: A { 

    var value: Int 
} 

let array: [B] = [B(value: 10)] 

let singleAValue: A = array[0] // extracting works as expected 

var protocolArray: [A] = [] 
protocolArray.append(singleAValue) // we can put the value inside the `protocolArray` without problems 
print(protocolArray) 

let newProtocolArray: [A] = array // but why does this conversion not work? 

Antwort

9

Das Array des Protokolltyps hat eine andere Speicherdarstellung als ein Array von B Strukturen. Da ein Array von A viele verschiedene Objekttypen enthalten kann, muss der Compiler eine Indirektion (einen Wrapper um die Elemente im Array) erstellen, um sicherzustellen, dass alle dieselbe Größe haben.

Da diese Konvertierung möglicherweise kostspielig ist (wenn das Quell-Array groß ist), zwingt der Compiler Sie, es explizit zu machen, indem Sie das Quell-Array zuordnen. Sie können schreiben, entweder diese:

let newProtocolArray = array.map { $0 as A } 

oder dies:

let newProtocolArray: [A] = array.map { $0 } 

Beide gleichwertig sind.