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

unftdfkk  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(203)

在Swift 2.0中,我如何执行与@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model等效的操作?
基本上,我试图在我的类上定义一个属性,它必须既是NSManagedObject的子类,又符合SomeProtocol(我将调用由两者定义的方法)。
我看到了:https://stackoverflow.com/a/25826948/363789,但我不确定如何将此语法应用于属性定义...

ej83mcc0

ej83mcc01#

雨燕4
在Swift 4中,现在可以使用以下语法实现这一点:

var myObject: NSManagedObject & SomeProtocol
mcdcgff0

mcdcgff02#

不幸的是,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>

相关问题