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

els*_*udo 7 swift swift2

在Swift 2.0中,我该怎么做@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model呢?

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

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

Mar*_*rný 5

斯威夫特4

现在可以在Swift 4中使用以下语法:

var myObject: NSManagedObject & SomeProtocol
Run Code Online (Sandbox Code Playgroud)


Qby*_*yte 2

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