在Swift 2.0中,我怎样才能完成@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model
的等效操作?
基本上,我正在尝试在我的类上定义一个属性,它必须都是NSManagedObject
的子类并且符合SomeProtocol
(我将调用两者定义的方法)。
我看到了这个:https://stackoverflow.com/a/25826948/363789,但我不确定如何将此语法应用于属性定义......
答案 0 :(得分:5)
现在可以使用以下语法在Swift 4中实现:
var myObject: NSManagedObject & SomeProtocol
答案 1 :(得分:2)
不幸的是,Swift还不支持这种类型的组合。
作为解决方法的三个合理的好解决方案(第三个可能是最好的):
1。
您可以创建具有这些属性的其他类型,并且必须继承该类型以便用作model
。
class SomeManagedObject: NSManagedObject, SomeProtocol {
// conforming to protocol
func someMethod()
}
// type declaration
var model: SomeManagedObject
2。 解决此问题的一种更静态的方法是使用泛型:
class Aclass<T: NSManagedObject where T: SomeProtocol > {
var model: T
}
注意:你不必关心另一个必须是超类的类型,但是这个解决方案不像以前那样动态和抽象。
3。
您也可以制作自己的协议,并使NSManagedObject
符合扩展名:
protocol ManagedProtocol {
// if you want to access some methods/properties directly from the type
func method()
var variable: Int { get }
// otherwise call all methods/properties through "managedObject"
// this property also reduces casting if you want to have the object itself
var managedObject: NSManagedObject { get }
}
extension NSManagedObject: ManagedProtocol {
var managedObject: NSManagedObject { return self }
}
现在类型是抽象的,可以写成:
var model: protocol<ManagedProtocol, SomeProtocol>