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.
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.
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 var
struct
öğenin yeni bir kopyasını olacak ve dizide orijinal olanlar değişmeyecektir.
Swift'i daha iyi anlamaya yardımcı olan harika bir cevap. Teşekkür ederim! –
Nesnelerin yapısı veya sınıfın örneği mi? – vacawama
@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ı" –
' ekleyin. protokol @vacawama – vacawama