我想在
Swift 2中实现一个简单的GKGameModel.苹果的例子在Objective-C中表达,并包含这个方法声明(根据GKGameModel继承的NSCopying协议的要求):
- - (id)copyWithZone:(NSZone *)zone {
- AAPLBoard *copy = [[[self class] allocWithZone:zone] init];
- [copy setGameModel:self];
- return copy;
- }
这怎么翻译成Swift 2?在效率和忽视区方面是否适合?
- func copyWithZone(zone: NSZone) -> AnyObject {
- let copy = GameModel()
- // ... copy properties
- return copy
- }
NSZone已经不再在Objective-C中使用了很长时间.而传递的区域参数被忽略.从allocWithZone引用… docs:
This method exists for historical reasons; memory zones are no longer
used by Objective-C.
你也可以忽略它.
下面是一个如何符合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
附:此示例适用于Xcode Version 7.0 beta 5(7A176x).特别是dynamicType.init(self).
为Swift 3编辑
以下是Swift 3的copyWithZone方法实现,因为dynamicType已被弃用:
- func copy(with zone: NSZone? = nil) -> Any
- {
- return type(of:self).init(self)
- }