2014-10-19 13 views
17

Swift cinsinden tembel varlıklar birden fazla kez mi hesaplanıyor? Onlar, Objective-C'den (tembel somutlaşma)Swift'de hesaplanan hızlı varyasyonlar bir defadan fazla mıdır?

Paradigma değiştirildikleri izleniminin altındaydı.

ne yaparlar mı? Temelde sadece uygulama çağrılan ilk kez bir kez denir, sonra sadece hesaplanan ne döndürür?

Yoksa normal bilgisayarlı özelliği gibi her zaman denilen olsun ki? Temelde diğer örnek değişkenler erişebilir Swift bir bilgisayarlı özelliği istiyorum çünkü

sormak nedenidir. "FullName" adında bir değişkenim olduğunu ve sadece firstName ve lastName ile bitiştirdiğini varsayalım. Bunu Swift'de nasıl yaparım? Normal hesaplanmış vars (tembel olmayan) gibi diğer örnek değişkenlere erişemediğim gibi, tembel vars gitmenin tek yolu gibi görünüyor.

Yani temelde:

Swift tembel değişkenler Do kereden fazla denilen olsun? Öyleyse, örnek değişkenlere erişebilen bir hesaplanmış değişken nasıl oluşturabilirim? Eğer değilse, sadece bir değişken bir performans hesaplaması için bir kez hesaplanırsa, bunu nasıl yaparım?

cevap

3

Hayır, tembel özellikleri sadece bir kez başlatılır. Eğer yeni bir değer ayarlamak veya (opsiyonel özellikleri için) nil sıfırlanır ise tembel başlatıcı tekrar çağrılan değilolduğunu. Bir saklı özelliği tarafından desteklenen değil, bu nedenle başlatma dahil edilmez ve bu nedenle diğer örnek özelliklerini ifade edebilir -

Ne ihtiyacınız hesaplanan bir özellik olduğunu düşünüyorum.

Neden "(non-tembel) Normal bilgisayarlı vars ı diğer örnek değişkenler erişemez" öyle dedin?

+0

1. Bir bilgisayarlı tesiste depolanan özelliği tarafından desteklenmemektedir ne anlama geliyor? FullName firstName, lastName tarafından desteklenmiyor mu? tembel dışında 2. kez intiailized alma, ikisi arasındaki başlıca fark şudur: tembel için size * set * lazyFullName o zaman basitçe ayarlarsanız ... ama computedLazyFullName için daha sonra ayarlarsanız düzgün bazı mekanizma gerekir * depolanmış * firstName, lastName özelliklerini güncellemek mi istiyorsunuz? – Honey

16

lazy var ler sadece bir kez bunları kullanmak ilk defa hesaplanır. Bundan sonra, onlar normal bir değişken gibi. - Eğer yaptığı gibi

class LazyExample { 
    var firstName = "John" 
    var lastName = "Smith" 
    lazy var lazyFullName : String = { 
     [unowned self] in 
     return "\(self.firstName) \(self.lastName)" 
    }() 
} 

let lazyInstance = LazyExample() 

println(lazyInstance.lazyFullName) 
// John Smith 

lazyInstance.firstName = "Jane" 

println(lazyInstance.lazyFullName) 
// John Smith 

lazyInstance.lazyFullName = "???" 

println(lazyInstance.lazyFullName) 
// ??? 

bir bilgisayarlı özelliğini kullanın daha sonra yeniden hesaplamak isteyeceksiniz Eğer (a destek değişken ile, pahalı ise):

Bu oyun alanında test etmek kolaydır Objective-C.

+0

Kodunuzdaki yanlış bir şey ... ama değişikliği değiştirmek 'firstName' "Jane" eğer potansiyel önce ** yani yanıltıcı bazı bile lazyFullName' o zaman "Jane Smith ile" basacaktır' ** erişen – Honey

İlgili konular