web-dev-qa-db-fra.com

Méthodes de type d'appel dans une méthode d'instance

Apple a une bonne explication des méthodes de type (classe) ici .

Cependant, leur exemple ressemble à ceci:

class SomeClass {
    class func someTypeMethod() {
        // type method implementation goes here
    }
}
SomeClass.typeMethod()

Je vois exactement le même exemple partout.

Cependant, je dois appeler ma méthode de type depuis une instance de ma classe, et cela ne semble pas être calculé.

Je DOIS être en train de faire quelque chose de mal, mais j'ai remarqué que Apple ne supporte pas encore les propriétés de classe :(. Je me demande si je vais dans un puits sec pour de l'eau.

Voici ce que j'ai essayé (dans une cour de récréation):

class ClassA
{
    class func staticMethod() -> String { return "STATIC" }

    func dynamicMethod() -> String { return "DYNAMIC" }

    func callBoth() -> ( dynamicRet:String, staticRet:String )
    {
        var dynamicRet:String = self.dynamicMethod()
        var staticRet:String = ""

//        staticRet = self.class.staticMethod() // Nope
//        staticRet = class.staticMethod() // No way, Jose
//        staticRet = ClassA.staticMethod(self) // Uh-uh
//        staticRet = ClassA.staticMethod(ClassA()) // Nah
//        staticRet = self.staticMethod() // You is lame
//        staticRet = .staticMethod() // You're kidding, right?
//        staticRet = this.staticMethod() // What, are you making this crap up?
//        staticRet = staticMethod()  // FAIL

        return ( dynamicRet:dynamicRet, staticRet:staticRet )
    }
}

let instance:ClassA = ClassA()
let test:( dynamicRet:String, staticRet:String ) = instance.callBoth()

Est-ce que quelqu'un a un indice pour moi?

58
Chris Marshall
var staticRet:String = ClassA.staticMethod()

Cela marche. Il ne prend aucun paramètre, vous n'avez donc pas besoin d'en passer aucun. Vous pouvez également obtenir ClassA dynamiquement comme ceci:

Swift 2

var staticRet:String = self.dynamicType.staticMethod()

Swift

var staticRet:String = type(of:self).staticMethod()
100
Connor

Dans Swift 3, vous pouvez utiliser:

let me = type(of: self)
me.staticMethod()
57
Diogo T