如何符合NSCopying并在Swift 2中实现copyWithZone?

前端之家收集整理的这篇文章主要介绍了如何符合NSCopying并在Swift 2中实现copyWithZone?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在 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)
}

猜你在找的Swift相关文章