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.