2015-06-12 14 views
12

Swift'de varsayılan parametreyi self kullanabilir miyim? Bu kod oldukça yalındır hissediyor ama derleyici geri tekmeliyor mesajı anlamıyorum:`self`'i varsayılan parametre olarak kullan

func printTree(node: TreeNode = self, tabs: String = "") { 
    println(tabs + node.name!) 
    node.children.forEach { printTree(node: $0, tabs: tabs+"\t") } 
} 

Hata:

'TreeNode ->() -> TreeNode' is not convertible to 'TreeNode' 

Huh?

Ağaç geçişini çözmemde başka yollar da olabilir, ancak aslında varsayılan parametre kısıtlamasını merak ediyorum. Bu gerçek bir şey mi? Dokümanlarda bundan bahsediliyor mu? Ben bir tane bulamadım.

Güncelleme:

hiçbir bağımlılıkları ile sıfırdan yaptılar (Bir sınıf hiyerarşi vardı ve özel bir forEach maymun yama önce dahil). Hala hatalar:

class PeanutButterJelly { 
    var children: [PeanutButterJelly]? 
    func doDance(){ println("dancing") } 
    func everybodyDanceNow(pbj: PeanutButterJelly = self) { 
    pbj.doDance() 
    if let children = pbj.children { 
     for child in children { child.doDance() } 
    } 
    } 
} 

Hata:

Swift compilation error: unresolved identifier 'self' 

Xcode 6.3.2

+0

örn : soruyu önleyen bir çözüm: 'func printTree (sekmeler: String =" ") { println (sekmeler +" \ (isim) ") çocuklar? .forEach {$ 0.printTree (sekmeler: sekmeler +" \ t ")} } ' – SimplGy

+0

Hata, _implementation_ ile ilgili olmalıdır,' self' kullanılarak bir varsayılan parametre olarak t o derleyici. – akashivskyy

cevap

11

Can I use self as a default parameter in Swift

Eğerkonum zamanda

class TreeNode { 
    var otherNode : TreeNode = self // Use of unresolved identifier `self` 
    func printTree(tree:TreeNode = self) { } // Use of unresolved identifier `self` 
} 

: Bu

sayılı bir örnek yöntemi başlatılıyor zaman self diyemeyiz aynı nedenle temelde 210 bu varlığı (özellik veya yöntem) tanımlayarak, self diye bir şey yoktur. Bu yöntem, adı verilen adı verilen adı verilenişlevinin gövdesinin gövdesinin içinde olacaktır, çünkü bu işlev bazı örneklerde (self) çağrılacaktır.

Yapmak istediğinizi yapmanın kolay bir yolu, bu parametreyi nil varsayılan değeri ile bir İsteğe bağlı yapmaktır. Daha sonra, fonksiyonun gövdesinde, nil denetlemek ve kullanmak self:

class TreeNode { 
    func printTree(tree:TreeNode? = nil) { 
     let treeToPrint = tree ?? self 
     // do stuff 
    } 
} 

Şimdi hiçbir parametre ile printTree aramaya yasal, ve bunu yapmak ne istiyor:

TreeNode().printTree() 
+0

Oooo.Çünkü * tanımla * zamanda ayrıştırıldı ... Bu durumda tembel evalasyon/otomatik kapama kullanıp kullanamayacağımı merak ediyorum. Denememe izin ver... – SimplGy

0

unresolved identifier 'self' bir örneğinin örtük mülkiyet self 'kapsamı her örnek yöntemi içinde olduğu olmasının nedeni. Eğer örnekte çocuklara kendini varsayılan değerini değiştirirseniz objc içinde kendini başka versiyonu sınıfının türünü belirtir yoktur aksine hiçbir şey yoktur hatayı

'PeanutButterJelly.Type' does not have a member named 'children'

göreceksiniz hızlı olduğunu

İlgili konular