满足协议中声明的成员与子类型或符合类型的成员之间的关系



假设我想进行面向协议的编程,并且我有协议:

protocol BehaviorA {
    var date: NSDate {get}
    var name: String {get}
}
protocol BehaviorB {
    var creationInfo: BehaviorA {get}
}

我想用核心数据实现这个所有权模型的一个版本。核心数据希望每个模型实体都有一个特定的类,所以我创建了一个类ActualAActualB:

class ActualA: NSManagedObject, BehaviorA {
    @NSManaged var date: NSDate
    @NSManaged var name: String
}
class ActualB: NSManagedObject, BehaviorB {
    @NSManaged var creationInfo: ActualA
}

由于数据模型的关系,var的类型为ActualA。然而,我得到一个编译时错误,说ActualB不符合BehaviorB,如果我将creationInfo重新键入为BehaviorA,它就会消失。

然而,我希望有一种方法可以说,这个变量满足协议成员,因为它的类型至少与协议中声明的类型一样具有限制性。我能用什么方法做到这一点吗?任何PoP粉丝都有关于如何实现相互拥有的协议的建议,但一致性类型希望是特定的?

这很容易。我们只需要更改BehaviorB协议就可以使用associatedType:

protocol BehaviorB {
    associatedtype Info: BehaviorA
    var creationInfo: Info {get}
}

在这里,我们可以随心所欲地调用Info(任何有助于向BehaviorB的任何实现者指示此类型代表什么的东西)。

这有点像使用泛型。这里,Info可以是任何类型,只要该类型是BehaviorA、继承BehaviorA的协议或实现或继承BehaviorA的具体类型即可。

最新更新