满足成员在子协议或符合类型成员中声明的成员

时间:2016-04-17 23:30:54

标签: ios swift

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

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粉丝都有关于如何完成彼此拥有的协议的建议,但是符合标准的类型是否具体?

1 个答案:

答案 0 :(得分:2)

这很简单。我们只需要更改BehaviorB协议即可使用associatedType

protocol BehaviorB {
    associatedtype Info: BehaviorA

    var creationInfo: Info {get}
}

我们可以调用Info我们想要的任何内容(任何有助于向BehaviorB任何此类型代表的实施者指示的内容。

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