protocol multiple ios class swift static-methods static-members

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