2014-09-25 13 views
18

Swift ile biraz oynamaya başladığımda, ben sadece okumaya hazır ve tembel bir başlangıç ​​özelliği yazmayı denedim. Kodun satırını, sadece izin verilmediğini öğrenmek için yazdım.Tempoyla hızlı okuma özelliği

// no valid Swift code. 
lazy let foo : Int = { return 42 }() 

Tembel özelliklerini var olarak bildirmeniz gerekir. başlangıç ​​değeri alınamaz çünkü,

“Her zaman (var anahtar sözcüğüyle) bir değişken olarak tembel bir mal beyanında gerekir: hızlı kitap açıkça tembel ile izin belirten iyi bir neden için mümkün değildir örnek başlatma tamamlanana kadar. Sabit özellikler her zaman önce başlatma tamamlar bir değere sahip olmalıdır ve bu nedenle tembel olarak ilan edilemez.”

Ben Swift bir salt okunur tembel özelliği istiyorum varsayalım. Bunu arşivlemenin en iyi yolu nedir?

cevap

33

salt okunur ve özel sizin için eş bu özel durumda ise, o zaman açıkça ilan ederek ayarlayıcı özel yapabilirsiniz: değişmezlik ve tembellik arasında iyi bir uzlaşma

private(set) lazy var foo : Int = { return 42 }() 

. Bir bilgisayarlı mülkiyet ve özel yapı ile bunun

var foo : Int { return _foo } 
private lazy var _foo :Int = { return 42 }() 
+0

Özel ayarlayıcı benim için yeterli. Bu modeli sıklıkla C# olarak kullanırım. – MBulli

+0

Bence bu, "özel (set) lazy var foo = 42'" ye eşdeğer. Ayarlayıcıyı özel olarak işaretlerseniz, alıcıyı yalnızca ayarlayıcıyı ihmal etmek amacıyla bildirmenin bir anlamı yoktur. –

+3

Bu bir alıcı değildi, tembel bir örnekleme kapatmasıdır, ancak herhangi bir mantık içermediği için gerekli değildir. Bu yüzden özel (set) tembel var foo = 42' sadece aynı şekilde çalışacaktır. – Danchoys

5

Ayrıca tembel başlatır özel destek değişkeni kullanabilirsiniz. Bir blok sonucunun dolaylı olarak tembel olmasından ötürü, durağan değişkende tembel anahtar kelimeye gerek yoktur.

var foo: Int { 
    struct Holder { 
     static var value = { return 42 }() 
    } 
    return Holder.value 
} 
+3

Yanıtlarınız doğru olmasına rağmen, başka bir özelliği tanıtmadığından Antonios cevabını tercih ediyorum. – MBulli

+0

Kabul edilen yanıt şu anda çalışmıyor olsa da, bu yapar. – Barry

+0

@Barry kabul edilen yanıt şimdi çalışıyor (Xcode 7.1'den itibaren) –

2

Olası:

+0

Bu akıllıca ve bence bazı durumlarda faydalıdır, ama ne yazık ki, hesaplanan değer "self" nesnesine hızlı bir şekilde yüklenmediğinde kullanışlı değildir iç yapıların dış kapsamı kapatmasına izin vermeyin. –

+0

@Daniel Mükemmel bir noktaya değiniyorsunuz, ancak bu yaklaşım soru bağlamında mükemmel bir şekilde çalışıyor. – kevin