¿Cómo hago métodos / propiedades de clase en Swift?


97

Los métodos de clase (o estáticos) en Objective-C se lograron usando +declaraciones.

@interface MyClass : NSObject

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

@end

¿Cómo se puede lograr esto en Swift?

Respuestas:


152

Se denominan propiedades de tipo y métodos de tipo y se utilizan las palabras clave classo 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
No creo que se limite a Playground, tampoco se compila en una aplicación.
Erik Kerber

@ErikKerber Es bueno saberlo, todavía no los necesitaba, así que no me he probado, gracias.
Pascal

Xcode 6.2 todavía informa 'variables de clase aún no admitidas' contra cualquier elemento del formato 'class var varName: Type'.
Ali Beadle

En Swift 2.0+, no necesita la classpalabra clave antes de una función o una propiedad de tipo calculado.
Govind Rai

20

Se denominan propiedades de tipo y métodos de tipo en Swift y usted usa la palabra clave class.
Declarar un método de clase o método de tipo en Swift:

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

Accediendo a ese método:

SomeClass.someTypeMethod()

o puede referir métodos en rápido


Muchas gracias! Es incluso más fácil que una clase NSObject en Objective-C y eso ya era bastante fácil de configurar.
Supertecnoboff

14

Anteponga a la declaración classsi es una clase o staticsi es una estructura.

class MyClass : {

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

¿No necesitas la funcpalabra clave aquí?
Jamie Forrest

1
por supuesto. Me sirve para responder preguntas mientras estoy de pie en un autobús lleno de gente, jajaja. Corregido.
Archivo analógico

4

Swift 1.1 no tiene propiedades de clase almacenadas. Puede implementarlo utilizando una propiedad de clase de cierre que recupera un objeto asociado vinculado al objeto de clase. (Solo funciona en clases 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))
        }
    }

    ....
}

He estado aprendiendo Swift y me preguntaba si podría adjuntar objetos asociados a instancias de clase Swift. Parece que la respuesta es "algo así". (Sí, pero solo objetos que son una subclase de NSObject.) Gracias por resolver eso por mí. (Votado)
Duncan C

4

Anteponga la declaración con class o static si es una función, o con static si es una propiedad.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.