Swift 将属性用作同一类中方法的默认参数值
在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
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
。