Jak utworzyć metody / właściwości klas w języku Swift?

97

Metody klasowe (lub statyczne) w Objective-C zostały zrealizowane przy użyciu +deklaracji.

@interface MyClass : NSObject

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

@end

Jak można to osiągnąć w Swift?

Erik Kerber
źródło

Odpowiedzi:

152

Nazywane są one właściwościami typu i metodami typu, a używasz słów kluczowych classlub 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
źródło
5
Myślę, że nie ogranicza się do Playground, nie kompiluje się też w aplikacji.
Erik Kerber
@ErikKerber Dobrze wiedzieć, jeszcze ich nie potrzebowałem, więc nie testowałem siebie, dzięki.
Pascal
Xcode 6.2 nadal raportuje „zmienne klasy nie są jeszcze obsługiwane” w przypadku dowolnego formularza „class varName: Type”.
Ali Beadle
W Swift 2.0+ nie potrzebujesz classsłowa kluczowego przed funkcją lub właściwością typu obliczonego.
Govind Rai
20

Nazywa się je właściwościami typu i metodami typu w języku Swift i używa się słowa kluczowego class.
Deklarowanie metody klasy lub metody Type w swift:

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

Dostęp do tej metody:

SomeClass.someTypeMethod()

lub możesz szybko polecić metody

Rohit
źródło
Dziękuję bardzo! Jest to nawet łatwiejsze niż klasa NSObject w Objective-C i już było całkiem łatwe do skonfigurowania.
Supertecnoboff
14

Dołącz do deklaracji, classjeśli jest to klasa, lub staticjeśli jest to struktura.

class MyClass : {

    class func aClassMethod() { ... }
    func anInstanceMethod()  { ... }
}
Plik analogowy
źródło
Nie potrzebujesz functutaj słowa kluczowego?
Jamie Forrest
1
oczywiście. Służy mi do odpowiadania na pytania stojąc w zatłoczonym autobusie, lol. Poprawione.
Plik analogowy
4

Swift 1.1 nie ma przechowywanych właściwości klas. Można to zaimplementować za pomocą właściwości klasy zamknięcia, która pobiera skojarzony obiekt powiązany z obiektem klasy. (Działa tylko w klasach pochodnych od 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
źródło
Uczyłem się języka Swift i zastanawiałem się, czy można dołączyć powiązane obiekty do instancji klasy Swift. Wygląda na to, że odpowiedź brzmi „trochę”. (Tak, ale tylko obiekty, które są podklasą NSObject). Dziękuję za rozwiązanie tego dla mnie. (Głosowano)
Duncan C
4

Dołącz do deklaracji atrybut class lub static, jeśli jest to funkcja, lub static, jeśli jest to właściwość.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
techloverr
źródło