是否可以在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为一个论点?

这个问题是由Xcode中的以下提示引起的。 Xcode suggests methods when you type dot after a class name

这个建议是什么意思?

+1

是[这个问题](http://*.com/questions/35870781/swift -inheritance-supers-super)对你的情况有用吗? –

+0

@AhmadF,差不多 - 我想知道Xcode的建议来自哪里。 – Schmo

+1

@Schmo这是因为[实例方法是curried函数](https://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)。 – Hamish

@ 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()。您还必须定义一个单独的实例方法。

+0

同意,但对我来说目前还不清楚Xcode试图说些什么。 – Schmo

+1

@Schmo从技术上讲,实例方法是一个参数 - “self”的方法。然后您可以使用该方法作为一个参数的函数。 – Sulthan