Wie erstelle ich Klassenmethoden / -eigenschaften in Swift?


97

Klassenmethoden (oder statische Methoden) in Objective-C wurden mithilfe +von Deklarationen durchgeführt.

@interface MyClass : NSObject

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

@end

Wie kann dies in Swift erreicht werden?

Antworten:


152

Sie werden als Typeneigenschaften und Typmethoden bezeichnet, und Sie verwenden die Schlüsselwörter classoder 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
Ich denke nicht, dass es auf Playground beschränkt ist, es wird auch nicht in einer App kompiliert.
— Erik Kerber

@ErikKerber Gut zu wissen, brauchte sie noch nicht, also habe ich mich nicht getestet, danke.
— Pascal

Xcode 6.2 meldet weiterhin "Klassenvariablen, die noch nicht unterstützt werden" für alle Elemente der Form "Klasse var varName: Typ".
— Ali Beadle

In Swift 2.0+ benötigen Sie das classSchlüsselwort nicht vor einer Funktion oder einer Eigenschaft mit berechnetem Typ.
— Govind Rai

20

Sie werden in Swift als Typeneigenschaften und Typmethoden bezeichnet, und Sie verwenden das Schlüsselwort class.
Deklarieren einer Klassenmethode oder Typmethode in Swift:

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

Zugriff auf diese Methode:

SomeClass.someTypeMethod()

oder Sie können Methoden schnell verweisen


Ich danke dir sehr! Es ist noch einfacher als eine NSObject-Klasse in Objective-C und das war bereits ziemlich einfach einzurichten.
— Supertecnoboff

14

Stellen Sie der Deklaration vor, classob es sich um eine Klasse oder um staticeine Struktur handelt.

class MyClass : {

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

Benötigen Sie das funcSchlüsselwort hier nicht?
— Jamie Forrest

1
natürlich. Dient mir zur Beantwortung von Fragen, während ich in einem überfüllten Bus stehe, lol. Korrigiert.
— Analoge Datei

4

Swift 1.1 hat keine Klasseneigenschaften gespeichert. Sie können es mithilfe einer Closure-Class-Eigenschaft implementieren, die ein zugeordnetes Objekt abruft, das an das Klassenobjekt gebunden ist. (Funktioniert nur in Klassen, die von NSObject abgeleitet sind.)

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))
        }
    }

    ....
}

Ich habe Swift gelernt und mich gefragt, ob Sie zugeordnete Objekte an Swift-Klasseninstanzen anhängen können. Es klingt wie die Antwort ist "irgendwie". (Ja, aber nur Objekte, die eine Unterklasse von NSObject sind.) Vielen Dank, dass Sie das für mich gelöst haben. (Gewählt)
— Duncan C

4

Stellen Sie die Deklaration mit class oder static voran, wenn es sich um eine Funktion handelt, oder mit static, wenn es sich um eine Eigenschaft handelt.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.