ios - multiple - swift init class
Propiedades estáticas en Swift (3)
Estoy tratando de convertir el siguiente código Objective-C a Swift. En mi código 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
Dado que no puede acceder a los tipos declarados como este
private var items = [AnyObject]()
desde las funciones de clase en Swift, creé una propiedad almacenada para ello de esta manera.
class var items: [AnyObject] {
return [AnyObject]()
}
Y estoy tratando de llamar a un método desde una función de clase como esta.
class func someFunction() {
items.removeAll(keepCapacity: false)
}
Pero recibo este error El valor inmutable del tipo ''[AnyObject]'' solo tiene miembros mutantes llamados ''removeAll'' .
¿Alguien puede 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 lo peor es que cada vez que accede a ella, se crea una nueva instancia de
[AnyObject]
, por lo que lo que agregue, se perderá tan pronto como sea posible. la referencia queda fuera de alcance.
En cuanto al error, la propiedad estática calculada devuelve una copia inmutable de la matriz que crea en su cuerpo, por lo que no puede usar ninguno de los métodos de matriz declarados 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 uso a menudo 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 de manera más simple como:
SomeClass.items.append("test")
Sin embargo, el manual para Swift 2 todavía afirma que la enumeración y las estructuras pueden usar propiedades de almacenamiento estático.
Actualizado a Swift1.2
En Swift1.2 [Xcode6.3], puede declarar propiedades estáticas usando la palabra clave static, también puede declarar métodos estáticos usando la clase de palabra clave o static.
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
class
es que
static
es solo un alias para "class final", por lo que los métodos modificados con
static
no se pueden anular en las subclases.
Gracias @ Maiaux''s