Bagaimana cara membuat metode / properti kelas di Swift?


97

Metode kelas (atau statis) di Objective-C diselesaikan dengan menggunakan +deklarasi.

@interface MyClass : NSObject

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

@end

Bagaimana ini bisa dicapai di Swift?

Jawaban:


152

Mereka disebut sifat jenis dan metode jenis dan Anda menggunakan classatau statickata kunci.

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
Saya tidak berpikir itu terbatas pada Playground, itu juga tidak dapat dikompilasi di aplikasi.
Erik Kerber

@ErikKerber Senang mengetahui, belum membutuhkannya jadi belum menguji diri sendiri, terima kasih.
Pascal

Xcode 6.2 masih melaporkan 'variabel kelas belum didukung' terhadap apa pun yang berbentuk 'class var varName: Type'.
Ali Beadle

Di Swift 2.0+, Anda tidak memerlukan classkata kunci sebelum fungsi atau properti tipe yang dihitung.
Govind Rai

20

Mereka disebut properti tipe dan metode tipe di Swift dan Anda menggunakan kata kunci kelas.
Mendeklarasikan metode kelas atau metode Jenis dengan cepat:

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

Mengakses metode itu:

SomeClass.someTypeMethod()

atau Anda dapat merujuk Metode dengan cepat


Terima kasih banyak! Ini bahkan lebih mudah daripada kelas NSObject di Objective-C dan itu sudah cukup mudah untuk diatur.
Supertecnoboff

14

Tambahkan deklarasi dengan classif itu kelas, atau dengan staticif itu struktur.

class MyClass : {

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

Apakah Anda tidak membutuhkan funckata kunci di sini?
Jamie Forrest

1
tentu saja. Melayani saya untuk menjawab pertanyaan sambil berdiri di bus yang penuh sesak, lol. Diperbaiki.
File Analog

4

Swift 1.1 tidak memiliki properti kelas yang disimpan. Anda bisa mengimplementasikannya menggunakan properti kelas penutupan yang mengambil objek terkait yang terikat ke objek kelas. (Hanya berfungsi di kelas yang diturunkan dari 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))
        }
    }

    ....
}

Saya telah mempelajari Swift dan bertanya-tanya apakah Anda dapat melampirkan objek terkait ke instance kelas Swift. Sepertinya jawabannya adalah "semacam". (Ya, tetapi hanya objek yang merupakan subkelas dari NSObject.) Terima kasih telah menyelesaikannya untuk saya. (Memberikan suara)
Duncan C

4

Tambahkan deklarasi dengan class atau static jika merupakan fungsi, atau dengan static jika merupakan properti.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.