what programming library documentación developers developer book apple swift swift2 gameplay-kit

programming - swift requirements



¿Cómo ajustarme a NSCopying e implementar copyWithZone en Swift 2? (1)

NSZone ya no se usa en Objective-C durante mucho tiempo. Y se pasa por alto el argumento de la zone pasada. Cita de los documentos allocWithZone...

Este método existe por razones históricas; Las zonas de memoria ya no son utilizadas por Objective-C.

También es seguro ignorarlo.

Aquí hay un ejemplo de cómo cumplir con el protocolo NSCopying .

class GameModel: NSObject, NSCopying { var someProperty: Int = 0 required override init() { // This initializer must be required, because another // initializer `init(_ model: GameModel)` is required // too and we would like to instantiate `GameModel` // with simple `GameModel()` as well. } required init(_ model: GameModel) { // This initializer must be required unless `GameModel` // class is `final` someProperty = model.someProperty } func copyWithZone(zone: NSZone) -> AnyObject { // This is the reason why `init(_ model: GameModel)` // must be required, because `GameModel` is not `final`. return self.dynamicType.init(self) } } let model = GameModel() model.someProperty = 10 let modelCopy = GameModel(model) modelCopy.someProperty = 20 let anotherModelCopy = modelCopy.copy() as! GameModel anotherModelCopy.someProperty = 30 print(model.someProperty) // 10 print(modelCopy.someProperty) // 20 print(anotherModelCopy.someProperty) // 30

PS Este ejemplo es para Xcode versión 7.0 beta 5 (7A176x). Especialmente el dynamicType.init(self) .

Editar para Swift 3

A continuación se muestra la implementación del método copyWithZone para Swift 3, ya que dynamicType ha quedado en desuso:

func copy(with zone: NSZone? = nil) -> Any { return type(of:self).init(self) }

Me gustaría implementar un GKGameModel simple en Swift 2. El ejemplo de Apple se expresa en Objective-C e incluye esta declaración de método (como lo requiere el protocolo NSCopying del cual GKGameModel hereda):

- (id)copyWithZone:(NSZone *)zone { AAPLBoard *copy = [[[self class] allocWithZone:zone] init]; [copy setGameModel:self]; return copy; }

¿Cómo se traduce esto en Swift 2? ¿Es apropiado lo siguiente en términos de eficiencia e ignorar la zona?

func copyWithZone(zone: NSZone) -> AnyObject { let copy = GameModel() // ... copy properties return copy }