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
}