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?

Erik Kerber
sumber

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
Pascal
sumber
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

Rohit
sumber
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()  { ... }
}
File Analog
sumber
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))
        }
    }

    ....
}
John Wallace
sumber
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] = []
}
techloverr.dll
sumber