Як зробити методи / властивості класу в Swift?


97

Класові (або статичні) методи в Objective-C були виконані за допомогою +декларацій.

@interface MyClass : NSObject

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

@end

Як цього можна досягти в Swift?

Відповіді:


152

Вони називаються властивостями типу і методами типу, і ви використовуєте ключові слова classабо 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
Я не думаю, що це обмежується Playground, воно також не компілюється в додатку.
Ерік Кербер

@ErikKerber Приємно знати, вони ще не потрібні, тому не перевіряв себе, дякую.
Паскаль

Xcode 6.2 все ще повідомляє про "змінні класу, які ще не підтримуються", щодо будь-якої форми "клас var varName: Type".
Алі Бідл

У Swift 2.0+ вам не потрібно classключове слово перед функцією або властивістю обчислюваного типу.
Govind Rai

20

Вони називаються властивостями типу та методами типу в Swift, і ви використовуєте ключове слово клас.
Оголошення методу класу або методу типу в швидкому режимі:

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

Доступ до цього методу:

SomeClass.someTypeMethod()

або ви можете швидко посилатися на Методи


Дуже дякую! Це навіть простіше, ніж клас NSObject в Objective-C, і це вже було досить просто налаштувати.
Supertecnoboff

14

Додайте декларацію за classдопомогою класу або, staticякщо це структура.

class MyClass : {

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

Вам не потрібно funcключове слово тут?
Джеймі Форрест,

1
звичайно. Служить мені для відповіді на питання, стоячи в переповненому автобусі, ха-ха. Виправлено.
Аналоговий файл

4

Swift 1.1 не має збережених властивостей класу. Ви можете реалізувати це за допомогою властивості класу закриття, яка отримує пов'язаний об'єкт, прив'язаний до об'єкта класу. (Працює лише в класах, похідних від 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))
        }
    }

    ....
}

Я вивчав Swift і цікавився, чи можете ви приєднати пов'язані об'єкти до екземплярів класу Swift. Здається, відповідь така ". (Так, але лише об'єкти, які є підкласом NSObject.) Дякую, що вирішили це для мене. (Проголосовано)
Duncan C

4

Додайте декларацію до класу або статики, якщо це функція, або зі статичним, якщо це властивість.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.