Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 协议中声明的满足成员,成员为子类型或符合类型_Ios_Swift - Fatal编程技术网

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
属性,因为这是我正在使用的依赖注入库的一个要求。有什么办法可以同时允许这两种情况吗?基于我认为这是不可能的。我将寻找解决办法。