在Swift 2.0中,我该怎么做@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model呢?
基本上,我正在尝试在我的类上定义一个属性,它必须都是NSManagedObjectAND 的子类符合SomeProtocol(我将调用两者定义的方法).
我看到了这个:https://stackoverflow.com/a/25826948/363789,但我不确定如何将此语法应用于属性定义...
现在可以在Swift 4中使用以下语法:
var myObject: NSManagedObject & SomeProtocol
Run Code Online (Sandbox Code Playgroud)
不幸的是 Swift 还不支持这种类型组合。
三个合理的好的解决方案作为解决方法(第三个可能是最好的):
1. 您可以创建另一个具有这些属性的类型,并且所有类型都必须继承它才能用作model.
class SomeManagedObject: NSManagedObject, SomeProtocol {
// conforming to protocol
func someMethod()
}
// type declaration
var model: SomeManagedObject
Run Code Online (Sandbox Code Playgroud)
2.解决这个问题的一个更静态的方法是使用泛型:
class Aclass<T: NSManagedObject where T: SomeProtocol > {
var model: T
}
Run Code Online (Sandbox Code Playgroud)
注意:您不必关心另一种必须是超类的类型,但此解决方案不像以前的那样动态和抽象。
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 }
}
Run Code Online (Sandbox Code Playgroud)
现在类型是抽象的,可以写成:
var model: protocol<ManagedProtocol, SomeProtocol>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |