2016-04-02 12 views
1

Orada similar questions var, ancak bu en yeni Swift 2.2 sürümü. Umarım şimdi bir çözüm var çünkü bu zihnimde Protocol-Oriented Programming'a büyük bir engel gibi görünüyor. Bu uygun protokoller bir dizi olarak sınıfların bir dizi tedavi etmek için herhangi bir şekilde var Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0X0).Protokol türlerini diziye dökerken önemli hata: Objective-C'den köprülenmiş olamaz

protocol P: class { 
    var value:Int {get} 
} 

class X: P { 
    var value = 0 

    init(_ value:Int) { 
     self.value = value 
    } 
} 

func getItems() -> [P] { 
    let items: [X] = [X(1), X(2), X(3)] 
    return items 
} 

let results: [P] = getItems() 

: Bu

bir hata ile let results atama başarısız? Bu, özellikle protocol-oriented ağırlığındaki bir dil için gerçekten basit ve doğal bir istek gibi görünüyor.

@objc veya flatMap veya bağımlılık zinciri ve performans üzerinde büyük etkileri nedeniyle kullanmak istemiyorum - bu bir kesmek olacaktır. Bunun doğal olarak çalışmasını isterim ya da umarız Apple/Swift açık kaynak ekibine sunabileceğimiz ve sunabileceğimiz bir hata.

cevap

0

i sorunuzu anlamıyorum olabilir, ama [P] çalışmıyor olarak [X] döküm neden bu

protocol P: class { 
    var value:Int {get} 
} 

class X: P { 
    var value = 0 

    init(_ value:Int) { 
     self.value = value 
    } 
} 

func getItems() -> [P] { 
    let items: [P] = [X(1), X(2), X(3)] 
    return items 
} 

let results = getItems() 
results.forEach { (p) in 
    print(p.value) 
} 
/* 
1 
2 
3 
*/ 

çalışır? Bir sonraki örneğe bakın! Sonuçlardan

let arrX = results.flatMap { $0 as? P } 
let arrX1 = results.flatMap { $0 as? P1 } 
print(arrX, arrX1) // [X, X, X] [X1, X1] 
gelen X ve X1 tipi öğeleri ayırmak istiyorsanız, neden flatMap iyi bir fikirdir kullanarak nedeni ise

protocol P: class { 
    var value:Int {get} 
} 
protocol P1: class { 
    var value: Double { get } 
} 
protocol Z {} 
class X: P,Z { 
    var value = 0 

    init(_ value:Int) { 
     self.value = value 
    } 
} 
class X1: P1,Z { 
    var value = 0.0 

    init(_ value:Double) { 
     self.value = value 
    } 
} 

func getItems() -> [Z] { 
    // the only common type of all items is protocol Z !!!! 
    let items: [Z] = [X(1), X(2), X(3), X1(1), X1(2)] 
    return items 
} 

let results = getItems() 
print(results.dynamicType) 
results.forEach { (p) in 
    if let p = p as? P { 
     print("P:", p.value) 
    } 
    if let p = p as? P1 { 
     print("P1:", p.value) 
    } 
} 
/* 
Array<Z> 
P: 1 
P: 2 
P: 3 
P1: 1.0 
P1: 2.0 
*/ 

İlgili konular