2017-04-21 109 views
5

Durumda olmaması gereken bir şeyle ilgili bir sorun yaşıyorum gibi görünüyor ... Ama biraz yardım istemek istiyorum.Özellik başlatıcıları 'kendinden' önce çalışır

Yığınımda bazı açıklamaları yok.

Aşağıdaki gibi, birinin diğerine başvurduğu iki basit sınıfa sahip olmak;

class User { 
    lazy var name: String = "" 
    lazy var age: Int = 0 

    init (name: String, age: Int) { 
     self.name = name 
     self.age = age 
    } 
} 

class MyOwn { 
    let myUser: User = User(name: "John", age: 100) 
    var life = myUser.age 
    //Cannot use instance member 'myUser' within property initializer 
    //property initializers run before 'self' is available 
} 

Yorumlanan derleme hatasını alıyorum. Birisi lütfen durumu çözmek için ne yapmam gerektiğini söyler misiniz?

Yardım için herhangi bir iyi kişiye çok teşekkürler!

+2

Kodu bir yöntem içine koyun. Sınıfın üst seviyesinde birbirine bağlı olan özellikleri başlatamazsınız. Veya hesaplanmış bir özellik kullanın. Btw: "Kullanıcı" sınıfındaki "tembel" öznitelikleri işe yaramaz. – vadian

+0

@vadian, yardımlarınız için teşekkürler. – RafalK

cevap

5

olarak doğru böyle senaryolarda bir init oluşturmalıdır Vadian tarafından çekti:

class MyOwn { 
    let myUser: User 
    var life: Int 

    init() { 
     self.myUser = User(name: "John", age: 100) 
     self.life = myUser.age 
    } 
} 

Sen başka örneği mülkiyet bağlı bir saklı özellik için varsayılan bir değer sağlayamaz.

+1

bu benim problemlerimi kesinlikle yanıtlıyor. Teşekkür ederim! – RafalK

+0

Bir şey değil! Uygulamanızda iyi şanslar ;-) –

2

Böyle hayat beyan etmelidir:

lazy var life:Int = { 
    return self.myUser.age 
}() 

Eğer başlatma işlemi sırasında başka bir özellik ile (değişken) başlatılması çalışıyoruz çünkü. Şu anda değişkenler henüz mevcut değildir.

+0

İyi çalışmalı, ama bunun için fazla tembel kullanmıyor musunuz? ;-) –

+1

@PauloMattos Cevabınızda sunulan kod mimarisi en azından benim için daha kabul edilebilir. Ama bir insanın neden uygulamak istediği mimariye ihtiyaç duyduğunu söyleyemem. Ona derleme hataları olmadan nasıl yapılacağını gösterdim ve onun hatalarının ne olduğunu açıkladım –