2015-08-20 4 views
13

Ich möchte ein einfaches GKGameModel in Swift 2. Apples Beispiel implementieren ist in Objective-C und enthält diese Methode Erklärung ausgedrückt (wie durch Protokoll NSCopying aus dem GKGameModel inherits erforderlich):Wie kann ich NSCopying anpassen und copyWithZone in Swift 2 implementieren?

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

Wie dies nicht übersetzen in Swift 2? Ist das Folgende in Bezug auf Effizienz und Ignorierzone angemessen?

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

Antwort

31

NSZone wird in Objective-C schon lange nicht mehr verwendet. Und übergeben zone Argument wird ignoriert. Zitat aus der Dokumentation:

Diese Methode existiert aus historischen Gründen; Speicherzonen werden nicht mehr von Objective-C verwendet.

Sie können es auch ignorieren.

Hier ist ein Beispiel für die Übereinstimmung mit NSCopying Protokoll.

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. Dieses Beispiel ist für Xcode Version 7.0 Beta 5 (7A176x). Vor allem die dynamicType.init(self).

Edit für Swift 3

Unten ist die copyWithZone Methode Implementierung für Swift 3 als dynamicType veraltet ist:

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

Ich habe versucht, dies für meine Klasse Umsetzung, aber wie kann ich eine Kopie erstellen beim Kopieren der Variablen der Klasse? Im Moment erhalte ich eine neue Instanz, die nicht die Eigenschaften hat, die von der alten Instanz kopiert wurden. –

+0

So kopieren Sie alle Eigenschaften einer Klasse auf einmal, anstatt die Zuweisung einzeln auszuführen. Weil Sie sehen, dass ich eine Klasse mit ungefähr 50 Eigenschaften habe, und es besteht eine hohe Wahrscheinlichkeit, dass ich die Zuweisung von einigen von ihnen vermissen könnte. Ein Ausweg? –

Verwandte Themen