2015-04-19 16 views
5

A sınıfı bir dize değeri sağlar. B Sınıfı, kendi içinde iki A tipi üyeye sahiptir ve bunlardan birini seçmek için hesaplanmış bir özellik "v" sağlar.Swift: Protokolün bir özelliğine değer atanamadı?

class A { 
    var value: String 

    init(value: String) { 
     self.value = value 
    } 
} 

class B { 
    var v1: A? 
    var v2: A = A(value: "2") 

    private var v: A { 
     return v1 ?? v2 
    } 

    var value: String { 
     get { 
      return v.value 
     } 
     set { 
      v.value = newValue 
     } 
    } 
} 

Bu kod basittir ve çalışır.

protocol ValueProvider { 
    var value: String {get set} 
} 

class A: ValueProvider { 
    var value: String 

    init(value: String) { 
     self.value = value 
    } 
} 

class B: ValueProvider { 
    var v1: ValueProvider? 
    var v2: ValueProvider = A(value: "2") 

    private var v: ValueProvider { 
     return v1 ?? v2 
    } 

    var value: String { 
     get { 
      return v.value 
     } 
     set { 
      v.value = newValue // Error: Cannot assign to the result of the expression 
     } 
    } 
} 

Aşağıdaki kodu değiştirirseniz

v.value = newValue 

için

var v = self.v 
v.value = newValue 

It: A ve B hem üyesi "değer" olduğu için, ben böyle bir protokol yapmak Yine çalışıyor!

Bu bir Swift hatası mı, yoksa iletişim kuralları için özel bir şey mi?

cevap

10

Bir class protokolü olarak protokolünü tanımlamak zorunda: Sonra

protocol ValueProvider : class { 
    var value: String {get set} 
} 

var value: String { 
    get { return v.value } 
    set { v.value = newValue } 
} 

derler ve beklendiği gibi çalışır (yani v1v1 != nil eğer tarafından başvurulan nesneye yeni bir değer atar ve v2 referanslı nesnesine).

vValueProvider türünün salt okunur hesaplanmış özelliğidir. Bir sınıf protokolü olarak derleyici protokolü tanımlayarak v bir başvuru türü olduğunu ve bu nedenle v.value özelliği referansının kendisi sabit bile modifiye edilebileceği bilir. v mülkiyet bir başvuru türüdür tip A orada çünkü

Başlangıçtaki kod örneği çalışır.

Ve geçici çözüm

set { 
    var tmp = v1 ?? v2 
    tmp.value = newValue 
} 

çalışmaları nedeniyle (okuma-yazma) değişkenlerin özellikleri herhangi bir durumda (değer türü veya referans tipi) ayarlanabilir.

+0

Güzel cevap ve teşekkürler. –

İlgili konular