假设我想进行面向协议的编程,并且我有协议:
protocol BehaviorA {
var date: NSDate {get}
var name: String {get}
}
protocol BehaviorB {
var creationInfo: BehaviorA {get}
}
我想用核心数据实现这个所有权模型的一个版本。核心数据希望每个模型实体都有一个特定的类,所以我创建了一个类ActualA
和ActualB
:
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
的具体类型即可。