2016-04-30 19 views
9

sono ufficialmente confuso perché questo non funziona (non c'è molto da spiegare qui):Swift 2.2: non è possibile convertire il valore di tipo '[B]' al tipo specificato '[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? 

risposta

9

La matrice del tipo di protocollo ha una rappresentazione di memoria diversa da una matrice di strutture B. Poiché un array di A può contenere molti tipi diversi di oggetti, il compilatore deve creare un riferimento indiretto (un wrapper attorno agli elementi dell'array) per garantire che abbiano tutti la stessa dimensione.

Poiché questa conversione è potenzialmente costosa (se l'array di origine è di grandi dimensioni), il compilatore obbliga a renderlo esplicito mediante il mapping sull'array di origine. È possibile scrivere o questo:

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

o questo:

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

Entrambi sono equivalenti.

Problemi correlati