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

Sal*_*han 8 core-data ios swift swift-protocols swift3

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

例如:

extension Identifiable where Self: NSManagedObject, Self: JsonParseDescriptor {
    func someMethod() { }
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个从Core数据中检索到的对象,我想将它转换为上述协议,以便在其上调用someMethod.我可以使用转换为协议protocol<Identifiable, JsonParseDescriptor>,但是如何在其中包含NSManagedObejct类型呢?

谢谢

Hex*_*ire 6

Swift 4开始,现在可以直接进行上述转换,而无需使用棘手的解决方法。该任务的完成方式与我们完成协议组合的方式类似:

var myVar = otherVar as! (Type & Protocol)
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*ica 3

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

有关详细信息,请参阅票证SR-1009SR-1447。您还应该查看这个答案。

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

protocol _NSManagedObject {
    //the methods you want
}

extension NSManagedObject: _NSManagedObject {}

extension Identifiable where Self: _NSManagedObject, Self: JsonParseDescriptor {
    func someMethod() { }
}
Run Code Online (Sandbox Code Playgroud)