2014-06-19 18 views
40

Xcode6-beta2 kullanıyorum, ancak ilk genel betadan beri aynı sorunu yaşıyorum. Obj-C UIViewController Benim Swift alt sınıf şuna benzer:Kapatma örnek özniteliklerinden özelliklere erişim

(Function) 
<_TtC12SwiftiOSTest6SomeVC: 0x10bf1ed10> 
<_TtC12SwiftiOSTest6SomeVC: 0x10bf1ed10> 

(c2 ve öyle ki sadece farklı C3:

class SomeVC: UIViewController { 
    var c1:() ->() = { 
     println(self) 
    } 

    var c2:() ->() { 
     get { 
      return { println(self) } 
     } 
    } 

    var c3:() ->() { 
     return { println(self) } 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     c1() 
     c2() 
     c3() 
    } 
} 

VC gösterildiğinde, aşağıdaki satırları basılmış bkz sadece gettable ise bir bilgisayarlı özellik için get {...} dahil etmek gerekli değildir.)

Yani, birinci kapatma en kendini, işlev/kapama türü kendisi başvurmak gibi görünüyor diğerleri oysa self görünüm denetleyicisine bakın (beklediğim gibi). c1 ve c2/c3 arasındaki tek fark, birincinin depolanmış bir özellik olmasıdır, ikincisi hesaplanmış özelliklerdir, ancak kapakların ve yakalanan değerlerinin aynı olmasını beklerdim, yani her zaman kaplamayı görmek için kendi sınıf. Şeylerin şu anki haliyle, kapama sınıfının yöntemlerine/özelliklerine erişmek için c1 kapağının açık bir yolu yoktur.

Bu bir yerde belgelenmiş bir şey mi (Swift kitabını okudum ve hiçbir şey bulamadım), ya da bir yere yerleştirilmesi gereken bir türden bir beta-derleyici hatası mı?

cevap

52

Bu ilginç görünüyor. Ben de bir soruşturma yaptım. Sınıf örneği değişkenlerine self.instanceVariable gibi kapatma içinden erişebilirsiniz. Bu süre zarfında ,'un içinde self yakalar. Yani şimdi self, sınıf örneğinin kendisini ifade eder. Kapanışınız tembel özelliği olmalıdır.

A lazy property means that you can refer to self within the default closure, because the lazy property will not be accessed until after initialization has been completed and self is known to exist.

Sen @lazy eksik böylece self o (Function) benim tahminim olarak yazdırmadan neden kapatma thats bilinmemektedir. Bir sınıf, örneğin değişken sonuçları, güçlü bir referans döngüsü için kapatma atama

class TableViewController: UIViewController { 
var name = "anil" 
// Since swift 2.0 came out @lazy is replaced by lazy 
lazy var c1:() ->() = { 
    println(self) 
    println(self.name) 

} 

var c2:() ->() { 
get { 
    return { println(self) } 
} 
} 

var c3:() ->() { 
return { println(self) } 
} 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     c1() 
     c2() 
     c3() 
     } 
} 

Çıkış

<_TtC12TableViewApp19TableViewController: 0x10d54e000>
anil
<_TtC12TableViewApp19TableViewController: 0x10d54e000> <_TtC12TableViewApp19TableViewController: 0x10d54e000>


Güncelleme

. Bundan kaçınmalısın.Swift programming guide

Düzenleme
@lazy olarak değiştirildi: Swift Yani kapatılması doğru kullanımı

@lazy var c1:() ->() = { 
    [unowned self] in 
    println(self) 
    println(self.name) 

} 

Referans olabileceğini

If you assign a closure to a property of a class instance, and the closure captures that instance by referring to the instance or its members, you will create a strong reference cycle between the closure and the instance. Swift uses capture lists to break these strong reference cycles. For more information, see Strong Reference Cycles for Closures .

için Yakalama listesi kullanır tembel

+0

Denedim ve bu derleyici hatasını aldım: 'SomeVC ->() -> SomeVC!' 'name' adlı bir üye yok. ** Fakat **, kodunuz benimkiyle bir tane daha farklı - @lazy keywoard/directive/ne olursa olsun. Bunu ** c1 ** kapama tanımının önüne eklediğimde, işe yaradı, ** ismine bile ihtiyacım yok ** var. Bu daha da kafa karıştırıcı, tembel initlerin burada bir şeyle ne alakası var? – wujek

+0

Güncellenmiş yanıtımı kontrol edin. özellikle @lazy –

+0

Yani bu bir derleyici hata gibi görünüyor, değil mi? – wujek