Como faço para fazer métodos / propriedades de classe em Swift?

97

Métodos de classe (ou estáticos) em Objective-C foram realizados usando +em declarações.

@interface MyClass : NSObject

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

@end

Como isso pode ser alcançado no Swift?

Erik Kerber
fonte

Respostas:

152

Eles são chamados de propriedades de tipo e métodos de tipo e você usa as palavras-chave classou 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
Pascal
fonte
5
Não acho que seja limitado ao Playground, também não compila em um aplicativo.
Erik Kerber
@ErikKerber Bom saber, ainda não precisava deles, então não testei a mim mesmo, obrigado.
Pascal
O Xcode 6.2 ainda relata 'variáveis ​​de classe ainda não suportadas' contra qualquer coisa na forma 'class var varName: Type'.
Ali Beadle
No Swift 2.0+, você não precisa da classpalavra - chave antes de uma função ou propriedade de tipo calculado.
Govind Rai
20

Eles são chamados de propriedades de tipo e métodos de tipo em Swift e você usa a palavra-chave class.
Declarando um método de classe ou método de tipo em swift:

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

Acessando esse método:

SomeClass.someTypeMethod()

ou você pode consultar métodos rapidamente

Rohit
fonte
Muito obrigado! É ainda mais fácil do que uma classe NSObject em Objective-C e isso já era muito fácil de configurar.
Supertecnoboff
14

Anexe a declaração com classse for uma classe ou com staticse for uma estrutura.

class MyClass : {

    class func aClassMethod() { ... }
    func anInstanceMethod()  { ... }
}
Arquivo Analógico
fonte
Você não precisa da funcpalavra - chave aqui?
Jamie Forrest
1
claro. Serve para eu responder a perguntas enquanto estou em um ônibus lotado, lol. Corrigido.
Arquivo analógico de
4

O Swift 1.1 não tem propriedades de classe armazenadas. Você pode implementá-lo usando uma propriedade de classe de encerramento que busca um objeto associado vinculado ao objeto de classe. (Funciona apenas em classes derivadas de 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
fonte
Eu tenho aprendido Swift e gostaria de saber se você poderia anexar objetos associados a instâncias de classe Swift. Parece que a resposta é "mais ou menos". (Sim, mas apenas objetos que são uma subclasse de NSObject.) Obrigado por resolver isso para mim. (Votado)
Duncan C
4

Anexe a declaração com class ou static se for uma função ou com static se for uma propriedade.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Techloverr
fonte