定义必须是子类并符合协议的属性

时间:2015-09-07 14:09:45

标签: swift swift2

在Swift 2.0中,我怎样才能完成@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model的等效操作?

基本上,我正在尝试在我的类上定义一个属性,它必须都是NSManagedObject的子类并且符合SomeProtocol(我将调用两者定义的方法)。

我看到了这个:https://stackoverflow.com/a/25826948/363789,但我不确定如何将此语法应用于属性定义......

2 个答案:

答案 0 :(得分:5)

Swift 4

现在可以使用以下语法在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>