Как мне создать методы / свойства класса в 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 по-прежнему сообщает «переменные класса еще не поддерживаются» по отношению к чему-либо в форме «class var varName: Type».
Али Бидл
В Swift 2.0+ classключевое слово перед функцией или свойством вычисляемого типа не требуется .
Govind Rai,
20

В Swift они называются свойствами типа и методами типа, и вы используете ключевое слово class.
Быстрое объявление метода класса или метода Type:

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
конечно. Служит мне, чтобы отвечать на вопросы, стоя в переполненном автобусе, лол. Исправлено.
Analog File
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 или static, если это функция, или static, если это свойство.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
techloverr
источник