假设我想进行面向协议的编程,我有协议:
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粉丝都有关于如何完成彼此拥有的协议的建议,但是符合标准的类型是否具体?
答案 0 :(得分:2)
这很简单。我们只需要更改BehaviorB
协议即可使用associatedType
:
protocol BehaviorB {
associatedtype Info: BehaviorA
var creationInfo: Info {get}
}
我们可以调用Info
我们想要的任何内容(任何有助于向BehaviorB
任何此类型代表的实施者指示的内容。
这有点像使用泛型。这里Info
可以是任何类型,只要该类型为BehaviorA
,继承BehaviorA
的协议,或实现或继承BehaviorA
的具体类型。