Propiedades estáticas en Swift

Estoy intentando convertir el siguiente código Objective-C en Swift. En mi código de Objective-C, hay una variable estática y se accede desde un método de clase.

@implementation SomeClass static NSMutableArray *_items; + (void)someMethod { [_items removeAll]; } @end 

Como no se puede acceder a los tipos declarados como este private var items = [AnyObject]() de funciones de clase en Swift, creé una propiedad almacenada para él de esta manera.

 class var items: [AnyObject] { return [AnyObject]() } 

Y estoy tratando de invocar un método desde una función de clase como tal.

 class func someFunction() { items.removeAll(keepCapacity: false) } 

Pero obtengo este error. El valor inmutable de tipo ‘[AnyObject]’ solo tiene miembros mutantes llamados ‘removeAll’ .

¿Puede alguien decirme cuál es la causa de este error y cómo corregirlo?

Gracias.

Con este código:

 class var items: [AnyObject] { return [AnyObject]() } 

no está creando una propiedad almacenada; en cambio, es una propiedad calculada, y la peor parte es que cada vez que accede a ella, se crea una nueva instancia de [AnyObject] , por lo que sea lo que sea que agregue, se pierde tan pronto como la referencia está fuera del scope.

En cuanto al error, la propiedad calculada estática devuelve una copia inmutable de la matriz que usted crea en su cuerpo, por lo que no puede usar el método de matriz declarado como mutating , y removeAll es uno de ellos. La razón por la que es inmutable es porque ha definido un getter, pero no un setter.

Actualmente, las clases Swift no admiten propiedades estáticas, pero las estructuras sí; la solución que a menudo uso es definir una estructura interna:

 class SomeClass { struct Static { static var items = [AnyObject]() } } SomeClass.Static.items.append("test") 

Si desea deshacerse de la estructura Static cada vez que se refiere a la propiedad de items , simplemente defina una propiedad calculada de envoltura:

 class var items: [AnyObject] { get { return Static.items } set { Static.items = newValue } } 

para que se pueda acceder a la propiedad más simplemente de la siguiente manera:

 SomeClass.items.append("test") 

Actualizado a Swift1.2


En Swift1.2 [Xcode6.3], puede declarar propiedades estáticas utilizando palabras clave estáticas, también puede declarar métodos estáticos usando clases de palabras clave o estáticas.

 class SomeClass { // use static modifier to declare static properties. static var items: [AnyObject]! // use class modifier to declare static methods. class func classMethod() { items.removeAll(keepCapacity: false) } // use static modifier to declare static methods. static func staticMethod() { items.removeAll(keepCapacity: false) } } 

EDITAR:

La diferencia entre static modificador static y de class es que static es solo un alias para “final de clase”, por lo que los métodos modificados con static no se pueden anular en subclases.

Gracias @ Maiaux

Sin embargo, el manual de Swift 2 todavía afirma que solo la enumeración y las estructuras pueden usar propiedades de tienda estáticas.