【问题标题】:Can't make realm List<T> conform NSCopying无法使领域 List<T> 符合 NSCopying
【发布时间】:2016-08-24 13:10:29
【问题描述】:

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

  1. 泛型类的扩展不支持@objc。
  2. 我无法继承 List,因为它是最终类。
  3. 如果我在没有标记符合 NSCopying 的情况下实现“public func copy(with zone: NSZone? = nil) -> Any”。我只是收到错误消息:“...copyWithZone:]: unrecognized selector sent to instance”

所以虽然 List 中有 copy(),但我们永远无法真正使用它。

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

【问题讨论】:

    标签: swift list realm nscopying


    【解决方案1】:

    没有必要使List&lt;T&gt; 符合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&lt;T&gt;NSCopying 一致。您是否正在寻找列表的非托管副本?您可以使用Array(myList)List 中获取Array

    【讨论】:

    • 是的。我试图制作非托管副本。我想首先实现 NSCopying 的原因很简单。已经有一个从 NSObject 继承的 copy()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多