20

Swift 2で簡単に実装したいと思いますGKGameModel。Apple の例は Objective-C で表現されており、次のメソッド宣言が含まれています (継承元のプロトコルNSCopyingで必要とされる):GKGameModel

- (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
}
4

3 に答える 3

41

NSZone長い間、Objective-C では使用されなくなりました。渡されたzone引数は無視されます。allocWithZone...ドキュメントからの引用:

この方法は歴史的な理由から存在します。メモリ ゾーンは、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

PS この例は、Xcode バージョン 7.0 ベータ 5 (7A176x) 用です。特にdynamicType.init(self)

Swift 3の編集

以下はdynamicType非推奨となった Swift 3 の copyWithZone メソッドの実装です。

func copy(with zone: NSZone? = nil) -> Any
{
    return type(of:self).init(self)
}
于 2015-08-20T08:44:55.800 に答える