2016-04-30 10 views
9

belirtilen türü '[A]' için (burada açıklamak pek bir şey değildir):Swift 2.2: türünün değerini dönüştürmek olamaz '[B]' bu olmuyor neden resmen kafam karıştı

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? 

cevap

9

Protokol türünün dizisi, B yapıları dizisinden farklı bir bellek temsiline sahiptir. A dizisi birçok farklı nesne türü içerebileceğinden, derleyicinin hepsinin aynı boyuta sahip olduğundan emin olmak için bir dolaylı (dizideki öğeler etrafında bir sarıcı) oluşturması gerekir.

bu dönüşüm (kaynak dizisi büyükse) potansiyel olarak masraflı olduğundan, derleyici kuvvetleri kaynak dizisi üzerinde haritalama tarafından bu açık hale getirmek için. Ya bu yazabilirsiniz:

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

veya bu:

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

İkisi eşdeğerdir.

İlgili konular