Swift 同时将对象转换为类型和协议

Posted

技术标签:

【中文标题】Swift 同时将对象转换为类型和协议【英文标题】:Swift cast object to type and protocol at the same time 【发布时间】:2016-08-16 15:38:54 【问题描述】:

如何将给定对象转换为类型和协议,以便调用一些定义为扩展的方法

例如:

extension Identifiable where Self: NSManagedObject, Self: JsonParseDescriptor 
    func someMethod()  

现在我有一个从核心数据中检索到的对象,我想将其转换为上述协议,以便在其上调用 someMethod。我可以使用 protocol<Identifiable, JsonParseDescriptor> 强制转换为协议,但我怎样才能在其中包含 NSManagedObejct 类型呢?

谢谢

【问题讨论】:

仅供参考,这现在是可能的,你可以说extension Identifiable where Self: JsonParseDescriptor, Self == NSManagedObject 我最初的问题围绕着选角。现在有可能吗?我在某处读到他们正在计划一个 & 语法。他们现在这样做了吗? “以选角为中心”我不知道这是什么意思。你想做什么? 【参考方案1】:

Swift 4 开始,现在可以直接进行提及的演员表,而无需复杂的变通方法。该任务的完成方式与我们进行协议组合的方式类似:

var myVar = otherVar as! (Type & Protocol)

不再需要扩展和桥接协议。

【讨论】:

我仍然遇到同样的错误。价值为? (我的协议和协议)【参考方案2】:

您正在寻找的东西称为具体的同类型要求。不幸的是,在 Swift 中还不能实现。

详情请参阅票证SR-1009 和SR-1447。您还应该结帐this answer.

同时,您可以使用您需要的方法使用虚拟协议扩展 NSManagedObject

protocol _NSManagedObject 
    //the methods you want


extension NSManagedObject: _NSManagedObject 

extension Identifiable where Self: _NSManagedObject, Self: JsonParseDescriptor 
    func someMethod()  

【讨论】:

是的,我可以做到这一点,但不幸的是,我必须进行大量重构才能使其正常工作。 Swift 允许您通过混合类型和协议来创建受约束的协议扩展,但不允许我们对其进行强制转换,这是没有意义的。奇怪 是的,这是 Swift 最大的缺失功能之一,IMO。再说一次,首先,没有其他语言(我所知道的)允许这种级别的类型安全类可扩展性。 绝对!我确实很欣赏这种可扩展性,但我认为如果无法进行强制转换,它们应该阻止类型和协议的混合,因为你永远无法真正调用这些方法。感谢您的帮助

以上是关于Swift 同时将对象转换为类型和协议的主要内容,如果未能解决你的问题,请参考以下文章

在转换对象 Swift 中设置值

Swift 和 CoreData 与自定义类作为可转换对象

Swift:从接口类型数组转换为对象数组崩溃

swift:将传入的 json 数组转换为字典和对象

是否能够将 api 转换为 IPA 或将 java 转换为对象 c/swift? [关闭]

如何将模型对象转换为 JSON - Swift 4