Swift'de sınıf yöntemlerini / özelliklerini nasıl yaparım?


98

Objective-C'deki sınıf (veya statik) yöntemler +, bildirimlerde kullanılarak gerçekleştirildi .

@interface MyClass : NSObject

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

@end

Swift'de bu nasıl başarılabilir?

Yanıtlar:


153

Bunlar tür özellikleri ve tür yöntemleri olarak adlandırılır ve siz classveya staticanahtar sözcüklerini kullanırsınız.

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
Playground ile sınırlı olduğunu düşünmüyorum, bir uygulamada da derlenmiyor.
Erik Kerber

@ErikKerber Bilmekte fayda var, henüz onlara ihtiyacım yoktu, bu yüzden kendimi test etmedim, teşekkürler.
Pascal

Xcode 6.2, 'sınıf varName: Type' biçimindeki herhangi bir şeye karşı 'henüz desteklenmeyen sınıf değişkenlerini' bildirmeye devam ediyor.
Ali Beadle

Swift 2.0+ sürümünde, classbir işlevden veya hesaplanmış bir tür özelliğinden önce anahtar sözcüğe ihtiyacınız yoktur .
Govind Rai

21

Swift'de bunlara tür özellikleri ve tür yöntemleri denir ve siz class anahtar sözcüğünü kullanırsınız.
Swift'te bir sınıf yöntemi veya Tür yöntemi bildirmek:

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

Bu yönteme erişmek:

SomeClass.someTypeMethod()

veya Yöntemlere hızlı bir şekilde başvurabilirsiniz


Çok teşekkür ederim! Objective-C'deki bir NSObject sınıfından bile daha kolay ve kurulumu zaten oldukça kolaydı.
Supertecnoboff

15

Bildirimin başına bir sınıfsa classveya staticbir yapı ise ile ekleyin .

class MyClass : {

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

funcBurada anahtar kelimeye ihtiyacınız yok mu?
Jamie Forrest

1
elbette. Kalabalık bir otobüste dururken soruları cevaplamak için bana hizmet ediyor, lol. Düzeltildi.
Analog Dosya

4

Swift 1.1'in depolanmış sınıf özellikleri yoktur. Sınıf nesnesine bağlı ilişkili bir nesneyi getiren bir kapanış sınıfı özelliğini kullanarak uygulayabilirsiniz. (Yalnızca NSObject'ten türetilen sınıflarda çalışır.)

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

    ....
}

Swift'i öğreniyordum ve Swift sınıf örneklerine ilişkili nesneleri ekleyip ekleyemeyeceğinizi merak ettim. Cevap "bir nevi" gibi görünüyor. (Evet, ancak yalnızca NSObject'in alt sınıfı olan nesneler.) Bunu çözdüğünüz için teşekkürler. (Oylandı)
Duncan C

4

Bildirimin başına bir işlevse sınıf veya statik, bir özellikse statik ekleyin.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.