是否可以在Swift中指定自己的方法?
问题描述:
如果您有多个兼容的对象:是否可以在Swift中指定自己的方法?
class Animal { ... }
class Mammal: Animal { ... }
class Platypus: Mammal {
override func walk() {
if something {
Animal.walk(self: self)
} else {
Mammal.walk(self: self)
}
}
}
而且,比方说,你要调用一个超类的方法,在一种情况下,但其他超在另一种方法,这将有可能明确地传递self
为一个论点?
这个建议是什么意思?
答
@ Sulthan的答案正确地显示了如何将self
传递给超类函数。我只是想解释一下XCode的建议是什么。
如果仔细观察(或试用),您会发现以建议的方式调用函数实际上并不会调用而是将其返回。
由于f
是一个实例方法,它只能在实例上调用。如果您拨打X.f(...)
,则必须通过X
的实例才能在该实例上拨打f
。
因此,例如,如果您有:
class X {
var description: String
init(desc: String) {
description = desc
}
func f() {
print(description)
}
}
,然后你说
var function = X.f(X(desc: "A specific description")) // passing an instance of X
,那么你可以调用函数与
function()
,你会看到
A specific description
或者你可能也立即调用的函数有:
X.f(X(desc: "A specific description"))()
或者:
X(desc: "A specific description").f()
答
这是完全可能的,如果你使用静态派遣
class Animal {
static func walk(_ animal: Animal) {
...
}
}
class Mammal : Animal {
static func walk(_ mammal: Mammal) {
...
}
}
然而,但从架构上看很奇怪。它打破了多态。
请注意,您将无法再对实例调用animal.walk()
。您还必须定义一个单独的实例方法。
是[这个问题](http://*.com/questions/35870781/swift -inheritance-supers-super)对你的情况有用吗? –
@AhmadF,差不多 - 我想知道Xcode的建议来自哪里。 – Schmo
@Schmo这是因为[实例方法是curried函数](https://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)。 – Hamish