Swift多协议一致性,编译错误

Swift多协议一致性,编译错误,swift,Swift,我有下一个协议: 协议协议输出{ func funcA() } 协议协议{ 变量输入:ProtoAInput{get} } 协议协议{ func funcB() } 协议协议{ 变量输入:ProtoBInput{get} } 我想让我的StructC符合协议ProtoA和ProtoB,只需一个输入属性。它本身只是对self的引用,因为StructC也在一个单独的扩展中实现了ProtoAInput和ProtoBInput struct-StructC:ProtoA,ProtoB{ 变量输入:Pr

我有下一个协议:

协议协议输出{
func funcA()
}
协议协议{
变量输入:ProtoAInput{get}
}
协议协议{
func funcB()
}
协议协议{
变量输入:ProtoBInput{get}
}
我想让我的
StructC
符合协议
ProtoA
ProtoB
,只需一个
输入
属性。它本身只是对
self
的引用,因为
StructC
也在一个单独的扩展中实现了
ProtoAInput
ProtoBInput

struct-StructC:ProtoA,ProtoB{
变量输入:ProtoAInput&ProtoBInput{return self}
}
扩展结构C:ProtoAInput{
func funcA(){print(“funcA”)}
}
扩展结构c:ProtoBInput{
func funcB(){print(“funcB”)}
}
设s=StructC()
s、 funcA()
s、 funcB()
Swift 5.3编译器无法生成此代码,出现以下错误:

类型“StructC”不符合协议“ProtoA”

类型“StructC”不符合协议“ProtoB”

此代码是否违反任何编译规则?我不明白为什么这里不能同时符合两个协议的
输入
变量

你需要像下面这样的东西,而不是上面的

extension ProtoA where Self == StructC {
    var input: ProtoAInput { self }
}

extension ProtoB where Self == StructC {
    var input: ProtoBInput { self }
}

struct StructC: ProtoA, ProtoB {
}
使用Xcode 12.1/iOS 14.1进行测试和工作

这是(协议函数不能有协变返回)。斯威夫特就是不支持这一点。如果协议需要一个类型,那么这就是所需的类型。子类也是如此:

class ProtoAInput {}
class ProtoAInputSub: ProtoAInput {}

protocol ProtoA {
    var input: ProtoAInput { get }  // <=== requires superclass
}

struct StructA: ProtoA {
    var input: ProtoAInputSub // <=== So can't use a subclass here
}
class ProtoAInput{}
类ProtoAInputSub:ProtoAInput{}
协议协议{

var input:ProtoAInput{get}//协议不是那样工作的,请阅读。是的,我已经阅读了协议组成的相关内容,但我仍然不明白为什么中的代码不受支持,是否存在编译器无法处理的不确定性?我很惊讶,但这确实有效!
class ProtoAInput {}
class ProtoAInputSub: ProtoAInput {}

protocol ProtoA {
    var input: ProtoAInput { get }  // <=== requires superclass
}

struct StructA: ProtoA {
    var input: ProtoAInputSub // <=== So can't use a subclass here
}