Comment créer des méthodes / propriétés de classe dans Swift?

97

Les méthodes de classe (ou statiques) en Objective-C ont été réalisées à l'aide +de déclarations.

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

Comment cela peut-il être réalisé dans Swift?

Erik Kerber
la source

Réponses:

152

Ils sont appelés propriétés de type et méthodes de type et vous utilisez les mots clés classou static.

class Foo {
    var name: String?           // instance property
    static var all = [Foo]()    // static type property
    class var comp: Int {       // computed type property
        return 42
    }

    class func alert() {        // type method
        print("There are \(all.count) foos")
    }
}

Foo.alert()       // There are 0 foos
let f = Foo()
Foo.all.append(f)
Foo.alert()       // There are 1 foos
Pascal
la source
5
Je ne pense pas que ce soit limité à Playground, il ne se compile pas non plus dans une application.
Erik Kerber le
@ErikKerber C'est bon à savoir, je n'en ai pas encore besoin, donc je n'ai pas testé moi-même, merci.
Pascal
Xcode 6.2 signale toujours «les variables de classe non encore prises en charge» par rapport à tout ce qui est de la forme «class var varName: Type».
Ali Beadle
Dans Swift 2.0+, vous n'avez pas besoin du classmot - clé avant une fonction ou une propriété de type calculé.
Govind Rai
20

Ils sont appelés propriétés de type et méthodes de type dans Swift et vous utilisez le mot-clé class.
Déclarer une méthode de classe ou une méthode Type dans swift:

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

Accéder à cette méthode:

SomeClass.someTypeMethod()

ou vous pouvez référer des méthodes dans swift

Rohit
la source
Merci beaucoup! C'est encore plus facile qu'une classe NSObject en Objective-C et c'était déjà assez facile à configurer.
Supertecnoboff
14

Faites précéder la déclaration de classsi c'est une classe ou de staticsi c'est une structure.

class MyClass : {

    class func aClassMethod() { ... }
    func anInstanceMethod()  { ... }
}
Fichier analogique
la source
Vous n'avez pas besoin du funcmot - clé ici?
Jamie Forrest
1
bien sûr. Me sert pour répondre aux questions en se tenant debout sur un bus bondé, lol. Corrigée.
Fichier analogique
4

Swift 1.1 n'a pas de propriétés de classe stockées. Vous pouvez l'implémenter à l'aide d'une propriété de classe de fermeture qui récupère un objet associé lié à l'objet de classe. (Fonctionne uniquement dans les classes dérivées de NSObject.)

private var fooPropertyKey: Int = 0  // value is unimportant; we use var's address

class YourClass: SomeSubclassOfNSObject {

    class var foo: FooType? {  // Swift 1.1 doesn't have stored class properties; change when supported
        get {
            return objc_getAssociatedObject(self, &fooPropertyKey) as FooType?
        }
        set {
            objc_setAssociatedObject(self, &fooPropertyKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
        }
    }

    ....
}
John Wallace
la source
J'ai appris Swift et je me suis demandé si vous pouviez attacher des objets associés à des instances de classe Swift. On dirait que la réponse est «en quelque sorte». (Oui, mais uniquement les objets qui sont une sous-classe de NSObject.) Merci d'avoir résolu cela pour moi. (Voté)
Duncan C
4

Ajoutez à la déclaration une classe ou un static s'il s'agit d'une fonction, ou un static s'il s'agit d'une propriété.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
techloverr
la source