2016-08-24 23 views
0

我想使列表< T>符合NSCopying。我不能因为:不能使领域列表<T>符合NSCopying

  1. @objc在泛型类的扩展中不受支持。
  2. 我不能继承列表,因为它是一个最终的类。
  3. 如果我实现“公共func副本(带区:NSZone?=无) - >任何”没有标记符合NSCopying。我只是得到错误:“... copyWithZone:]:无法识别的选择发送到实例”

所以虽然在名单< T>复制(),我们永远无法真正使用它。

当前我必须使用迭代在列表< T>之外进行复制。我不能简单地使用instanceOfList.copy()。

回答

1

没有必要使List<T>符合NSCopying以便使用复制成员函数来扩展它,除非您尝试在Objective-C的通用上下文中复制它。 NSCopying是一个传统协议,在纯Swift中使用并不合理。它是类绑定的,并没有非常好的类型签名。

如果您尝试在纯Swift的通用上下文中使用NSCopying,请考虑定义您自己的Copyable协议并将其扩展为符合此类型。由于它不是@objc,你应该没问题。已经符合NSCopying的现有类型将需要扩展以符合Copyable,但您可以将逻辑放在NSCopying的扩展名中。

import Foundation 

protocol Copyable { 
    mutating func copy() -> Self 
} 

extension NSCopying { 
    func copy() -> Self { 
     return copy(with: nil) as! Self 
    } 
} 

extension MyTypeThatConformsToNSCopying: Copyable { } 

现在,我有点好奇,为什么你可能会尝试符合List<T>NSCopying。你在寻找一个不受管理的清单副本吗?您可以使用Array(myList)List获得Array

+0

是的。我正在尝试制作一个不受管理的副本。我想首先实施NSCopying的原因很简单。已经有一个从NSObject继承的copy()。 –