Swift 将属性用作同一类中方法的默认参数值

Swift 将属性用作同一类中方法的默认参数值,swift,Swift,在Swift类中,我希望使用属性作为同一类的方法的默认参数值 这是我的密码: class animal { var niceAnimal:Bool var numberOfLegs:Int init(numberOfLegs:Int,animalIsNice:Bool) { self.numberOfLegs = numberOfLegs self.niceAnimal = animalIsNice } func des

在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
    }
}
问题是我不能将我的niceamal属性用作默认函数值,因为它会触发编译时错误:

“animal.Type”没有名为“niceAnimal”的成员


我做错什么了吗?还是在Swift中不可能?如果不可能,你知道为什么吗?

我不认为你做错了什么

语言规范仅规定默认参数应位于非默认参数之前(p169),并且默认值由表达式定义(p637)

它没有说明该表达式可以引用什么。似乎不允许引用调用该方法的实例,即self,这似乎需要引用self.animal

作为一种解决方法,您可以将默认参数定义为默认值为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 {
         // print
       }
     }
 }

我不认为你做错了什么

语言规范仅规定默认参数应位于非默认参数之前(p169),并且默认值由表达式定义(p637)

它没有说明该表达式可以引用什么。似乎不允许引用调用该方法的实例,即self,这似乎需要引用self.animal

作为一种解决方法,您可以将默认参数定义为默认值为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 {
         // print
       }
     }
 }

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

最好的选择是重载该方法,您可以通过调用完整版本来实现较短的版本。我在这里只使用了一个struct来省略初始值设定项

struct Animal {

    var niceAnimal: Bool
    var numberOfLegs: Int

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

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

}

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

最好的选择是重载该方法,您可以通过调用完整版本来实现较短的版本。我在这里只使用了一个struct来省略初始值设定项

struct Animal {

    var niceAnimal: Bool
    var numberOfLegs: Int

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

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

}

非常感谢你的回答。作为一个开发人员,你怎么看待这种行为?我真的不确定。我认为默认参数值是一个很好的便利,但它们也会导致在计算默认表达式时出现令人惊讶的复杂情况。我知道用Python会变得很混乱。因此,我可以看到保持它明确和有限的优点。我认为解决办法还不错。考虑:如果默认值表达式是在实例的上下文中计算的(即,具有引用self的能力),那么它的行为几乎就像一个完全独立的实例方法,在您尝试调用的实例方法之前被调用。它可以访问私人成员吗?超类成员?这不是一个不可能的设计,但它可能隐藏了意外的惊喜。请注意,如果let在这里(甚至不在Swift 3中编译),则无需使用
,因为
niceamal
是非可选的,因此
将生成非可选的。只需说
let animalIsNice=animalIsNice??self.niceamal
。非常感谢您的回答。作为一个开发人员,你怎么看待这种行为?我真的不确定。我认为默认参数值是一个很好的便利,但它们也会导致在计算默认表达式时出现令人惊讶的复杂情况。我知道用Python会变得很混乱。因此,我可以看到保持它明确和有限的优点。我认为解决办法还不错。考虑:如果默认值表达式是在实例的上下文中计算的(即,具有引用self的能力),那么它的行为几乎就像一个完全独立的实例方法,在您尝试调用的实例方法之前被调用。它可以访问私人成员吗?超类成员?这不是一个不可能的设计,但它可能隐藏了意外的惊喜。请注意,如果let
在这里(甚至不在Swift 3中编译),则无需使用
,因为
niceamal
是非可选的,因此
将生成非可选的。只需说
let animalIsNice=animalIsNice??self.niceamal