Come creo metodi / proprietà di classe in Swift?


97

I metodi di classe (o statici) in Objective-C sono stati realizzati utilizzando +nelle dichiarazioni.

@interface MyClass : NSObject

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

@end

Come si può ottenere questo risultato in Swift?

Risposte:


152

Si chiamano proprietà del tipo e metodi di tipo e si utilizzano le parole chiave classo 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

5
Non penso sia limitato a Playground, non si compila nemmeno in un'app.
Erik Kerber

@ErikKerber Buono a sapersi, non ne avevo ancora bisogno, quindi non ho messo alla prova me stesso, grazie.
Pascal

Xcode 6.2 riporta ancora "variabili di classe non ancora supportate" rispetto a qualsiasi cosa nel formato "class var varName: Type".
Ali Beadle

In Swift 2.0+, non è necessaria la classparola chiave prima di una funzione o di una proprietà di tipo calcolato.
Govind Rai

20

Si chiamano proprietà del tipo e metodi di tipo in Swift e si utilizza la parola chiave class.
Dichiarazione di un metodo di classe o di un metodo Type in swift:

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

Accesso a quel metodo:

SomeClass.someTypeMethod()

oppure puoi fare riferimento a Metodi in modo rapido


Grazie mille! È ancora più semplice di una classe NSObject in Objective-C ed era già abbastanza facile da configurare.
Supertecnoboff

14

Anteponi la dichiarazione con classse è una classe o con staticse è una struttura.

class MyClass : {

    class func aClassMethod() { ... }
    func anInstanceMethod()  { ... }
}

Non hai bisogno della funcparola chiave qui?
Jamie Forrest

1
ovviamente. Mi serve per rispondere alle domande stando in piedi su un autobus affollato, lol. Corretto.
File analogico

4

Swift 1.1 non ha proprietà di classe memorizzate. È possibile implementarlo utilizzando una proprietà della classe di chiusura che recupera un oggetto associato legato all'oggetto della classe. (Funziona solo nelle classi derivate da 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))
        }
    }

    ....
}

Sto imparando Swift e mi chiedevo se potessi collegare oggetti associati alle istanze della classe Swift. Sembra che la risposta sia "una specie di". (Sì, ma solo oggetti che sono una sottoclasse di NSObject.) Grazie per aver risolto questo problema per me. (Votato)
Duncan C

4

Anteponi la dichiarazione con class o static se è una funzione o con static se è una proprietà.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.