2015-08-20 19 views
13

Vorrei implementare un semplice GKGameModel a Swift 2. esempio di Apple si esprime in Objective-C e comprende questa dichiarazione di metodo (come richiesto dal protocollo di NSCopying da cui GKGameModel eredita):Come conformarsi a NSCopying e implementare copyWithZone in Swift 2?

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

Come si traduce questo in Swift 2? È il seguente appropriato in termini di efficienza e ignorando la zona?

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

risposta

31

NSZone non viene utilizzato in Objective-C per un lungo periodo di tempo. E passato l'argomento zone viene ignorato. Citazione dal allocWithZone... documenti:

Questo metodo esiste per motivi storici; le zone di memoria non sono più utilizzate da Objective-C.

Sei sicuro di ignorarlo.

Ecco un esempio di come è conforme al protocollo 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 

P.S. Questo esempio è per Xcode versione 7.0 beta 5 (7A176x). Soprattutto lo dynamicType.init(self).

Edit per Swift 3

Di seguito è riportato l'implementazione del metodo copyWithZone per Swift 3 come dynamicType è stato deprecato:

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

Ho provato l'applicazione del presente per la mia classe, ma come posso creare una copia mentre copi anche le variabili della classe? Per ora, sto ottenendo una nuova istanza che non ha le proprietà copiate dalla vecchia istanza. –

+0

Come copiare tutte le proprietà di una classe contemporaneamente piuttosto che eseguire l'assegnazione una alla volta. Perché vedi che ho una classe con circa 50 proprietà, e c'è un'alta probabilità che io possa perdere l'incarico di alcune di esse. Qualsiasi via d'uscita? –

Problemi correlati