2016-09-05 21 views
7
protocols.forEach { $0.prop = nil } 

sonuç olduğunuforEach sonuçları değişmez hata içinde

protocols.forEach 
{ 
    var protocol = $0 

    protocol.prop = nil 
} 

Ama neden bunu kabul derleyici nedir? Bunu anlayacağını beklerdim.

+0

Nesnelerin yapısı veya sınıfın örneği mi? – vacawama

+0

@vacawama Hayır, sorduğun için teşekkürler, aslında protokol onlar. senin protokolünü uygulayan her şeyin bir sınıf olup olmadığını protokole 've işe yarayacak: "sınıfı" –

+0

' ekleyin. protokol @vacawama – vacawama

cevap

17

Protokol uygulayan öğelerden oluşan bir dizi var. Swift'e bunun bir class protokolü olduğunu söylemezseniz, bunun bir struct tarafından uygulanabileceğini varsayar.

forEach döngüsünde, sırayla dizideki her bir değere atanan bir let değişkenine (varsayılan olarak $0 adı verilir) sahip olacaksınız. Bir nesne diziniz varsa (bir sınıfın örnekleri), o öğenin özelliklerini değiştirebilirsiniz. Eğer bir dizi struct öğeniz varsa, bunlar değişmez olacaktır. Protokol uygulayan öğelerden oluşan bir diziniz varsa, Swift, : class protokol tanımınıza ekledikçe, daha kısıtlayıcı struct olarak davranır. Örneğin

:

protocol Xyzzy: class { 
    var prop: Int? { get set } 
} 

class Fred: Xyzzy, CustomStringConvertible { 
    var description: String { return "\(prop)" } 
    var prop: Int? = 17 
} 

let objects: [Xyzzy] = [Fred(), Fred(), Fred()] 

print(objects) // [Optional(17), Optional(17), Optional(17)] 

objects.forEach { $0.prop = nil } 

print(objects) // [nil, nil, nil] 

Sizin geçici çözüm: sınıf nesneler için

protocols.forEach 
{ 
    var protocol = $0 

    protocol.prop = nil 
} 

eserler o nesneyi değiştirmek için izin ardından nesneye yeni var işaretçi oluşturur ve çünkü. Not, bu geçici çözüm yalnızca sınıf örnekleri için çalışır. senin protokolün bir struct tarafından uygulanan, o zaman yeni varstruct öğenin yeni bir kopyasını olacak ve dizide orijinal olanlar değişmeyecektir.

+0

Swift'i daha iyi anlamaya yardımcı olan harika bir cevap. Teşekkür ederim! –