2014-11-23 57 views
10

在Swift类中,我想将属性用作同一类的方法的默认参数值。使用属性作为同一类中方法的默认参数值

这里是我的代码:

class animal { 
    var niceAnimal:Bool 
    var numberOfLegs:Int 

    init(numberOfLegs:Int,animalIsNice:Bool) { 
     self.numberOfLegs = numberOfLegs 
     self.niceAnimal = animalIsNice 
    } 

    func description(animalIsNice:Bool = niceAnimal,numberOfLegs:Int) { 
     // I'll write my code here 
    } 
} 

的问题是,我不能用我的niceAnimal属性作为默认函数值,因为它触发了我一个编译时错误:

'animal.Type' 没有一个名为 'niceAnimal'

我是乐队成员有什么问题?或者在Swift中不可能?如果这是不可能的,你知道为什么吗?

回答

6

我不认为你做错了什么。

语言规范只说默认参数应该在非默认参数(p169)之前,并且默认值由表达式(p637)定义。

它没有说明允许引用的表达式。似乎不允许引用您调用方法的实例,即self,这似乎有必要引用self.niceAnimal。

作为一种解决方法,您可以将默认参数定义为默认参数为nil的默认参数,然后使用在默认情况下引用成员变量的“if let”来设置实际值,如下所示:

class animal { 
    var niceAnimal:Bool 
    var numberOfLegs:Int 

    init(numberOfLegs:Int,animalIsNice:Bool) { 
     self.numberOfLegs = numberOfLegs 
     self.niceAnimal = animalIsNice 
    } 

    func description(numberOfLegs:Int,animalIsNice:Bool? = nil) { 
     if let animalIsNice = animalIsNice ?? self.niceAnimal { 
     // println 

     } 
    } 
} 
+0

非常感谢您的回答。作为开发者,你对这种行为有什么看法? – 2014-11-23 06:37:33

+2

我不确定。我认为默认的参数值是一个很好的方便,但是它们也可能会导致关于何时评估默认表达式的令人惊讶和复杂的角落案例。我知道它在Python中变得混乱。所以我可以看到保持清晰和有限的美德。我认为解决方法并不是很糟糕。 – algal 2014-11-23 06:41:09

+0

好吧,我明白,苹果可能想保持简单,然后... – 2014-11-23 06:46:40

0

我认为现在你只能使用文字和类型属性作为默认参数。

最好的选择是重载方法,你可以通过调用完整的方法来实现较短的版本。我只在这里使用了一个结构来省略初始化器。

struct Animal { 

    var niceAnimal: Bool 
    var numberOfLegs: Int 

    func description(#numberOfLegs: Int) { 
     description(niceAnimal, numberOfLegs: numberOfLegs) 
    } 

    func description(animalIsNice: Bool, numberOfLegs: Int) { 
     // do something 
    } 

}