Ios 协议中声明的满足成员,成员为子类型或符合类型
假设我想进行面向协议的编程,并且我有协议:Ios 协议中声明的满足成员,成员为子类型或符合类型,ios,swift,Ios,Swift,假设我想进行面向协议的编程,并且我有协议: protocol BehaviorA { var date: NSDate {get} var name: String {get} } protocol BehaviorB { var creationInfo: BehaviorA {get} } 我希望使用核心数据实现此所有权模型的一个版本。核心数据需要为每个模型实体创建一个特定的类,因此我创建了一个类ActualA和ActualB: class ActualA: NS
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
,它就会消失
然而,我希望有一种方式可以说,这个变量满足协议成员,因为它的类型至少和协议中声明的类型一样严格。我能以任何方式做这件事吗?任何流行歌迷都有关于如何完成协议的建议,这些协议彼此拥有,但一致性类型希望是具体的?这很容易。我们只需要更改
BehaviorB
协议以使用associatedType
:
protocol BehaviorB {
associatedtype Info: BehaviorA
var creationInfo: Info {get}
}
在这里,我们可以调用Info
我们想要的任何东西(任何有助于向BehaviorB
的任何实现者指明这种类型代表什么的东西)
这有点像使用泛型。这里的
Info
可以是任何类型,只要该类型是BehaviorA
、继承BehaviorA
的协议或实现或继承BehaviorA
的具体类型,这就相当容易了。我们只需要更改BehaviorB
协议以使用associatedType
:
protocol BehaviorB {
associatedtype Info: BehaviorA
var creationInfo: Info {get}
}
在这里,我们可以调用Info
我们想要的任何东西(任何有助于向BehaviorB
的任何实现者指明这种类型代表什么的东西)
这有点像使用泛型。这里的
Info
可以是任何类型,只要该类型是BehaviorA
,一个继承BehaviorA
的协议,或者一个实现或继承BehaviorA的具体类型感谢这些信息,我不知道相关的类型。这很有道理,但当我尝试它时,我发现属性不能是@objc协议的成员,因为它的类型不能在Objective-C
中表示。我在BehaviorB
上有@objc
属性,因为这是我正在使用的依赖注入库的一个要求。有什么办法可以同时允许这两种情况吗?基于我认为这是不可能的。我将寻找解决方法。感谢提供此信息,我不知道关联类型。这很有道理,但当我尝试它时,我发现属性不能是@objc协议的成员,因为它的类型不能在Objective-C
中表示。我在BehaviorB
上有@objc
属性,因为这是我正在使用的依赖注入库的一个要求。有什么办法可以同时允许这两种情况吗?基于我认为这是不可能的。我将寻找解决办法。