1

我正在尝试使 List< T > 符合 NSCopying。我不能因为:

  1. 泛型类的扩展不支持 @objc。
  2. 我不能继承 List 因为它是最终类。
  3. 如果我在没有标记符合 NSCopying 的情况下实现“公共 func 复制(带有区域:NSZone?= nil)-> 任何”。我只是得到错误:“...copyWithZone:]:无法识别的选择器发送到实例”

因此,虽然 List<T> 中有 copy(),但我们永远无法真正使用它。

当前我必须使用迭代在 List< T > 之外制作副本。我不能简单地使用 instanceOfList.copy()。

4

1 回答 1

1

除非您尝试在 Objective-C 的通用上下文中复制它,否则不必为了使用复制成员函数对其进行扩展而List<T>遵循。是一个遗留协议,在纯 Swift 中使用没有多大意义。它是类绑定的,没有很好的类型签名。NSCopyingNSCopying

如果您尝试NSCopying在纯 Swift 中的通用上下文中使用,请考虑定义您自己的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. 您是否正在寻找列表的非托管副本?您可以只使用从 aArray(myList)中获取Arraya List

于 2016-08-29T17:30:35.797 回答