定义属性必须是子类并符合协议
问题描述:
在Swift 2.0中,我该怎么做@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model
的等价物?定义属性必须是子类并符合协议
基本上,我试图在我的类上定义一个属性,它必须都是NSManagedObject
的子类,并且符合SomeProtocol
(我将调用由两者定义的方法)。
我看到这个:https://stackoverflow.com/a/25826948/363789,但我不知道我怎么可以把这种语法属性定义...
答
不幸的是斯威夫特不支持这种类型的成分呢。
三个合理良好的解决方案,解决方法(第三个可能是最好的):
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>
答
斯威夫特4
这现在可以在Swift 4中使用以下语法:
var myObject: NSManagedObject & SomeProtocol
对不起,但我不认为你在Objective-C中的财产声明是合法的。我发现它只适用于'id' –
JeremyP
嗯,你可能是对的。我想这就是为什么有一个NSObject协议。我想知道Swift是否可以简单地为每个类自动生成伴随协议? – elsurudo
如果这是真的,它有点糟糕,因为它会导致一些烦人的投射是必要的 – elsurudo