This question already has answers here:
Why can't a get-only property requirement in a protocol be satisfied by a property which conforms?

(3个答案)


2年前关闭。




[首先,如果有人对这个问题有更好的名字,建议就可以被接受。到目前为止,我找不到这个问题的更好的名字。]

所以,这就是问题。

假设我有一个协议(protocol)ProtocolA,一个协议(protocol)ProtocolB和一个协议(protocol)ProtocolX定义如下:
protocol ProtocolA {
  func doSomethingA()
}

protocol ProtocolB {
   func doSomethingB()
}

protocol ProtocolX {
   var handler: ProtocolA { get }
}

然后,在我的ProtocolX的类中有一个正确的实现,如下所示:
class Donald: ProtocolX {
   ...
   var handler: ProtocolA { ... }
   ...
}

然后一切正常并正确满足了协议(protocol)要求。



如果我这样实现:
class Donald: ProtocolX {
   ...
   var handler: ProtocolA & ProtocolB
   ...
}

我遇到一个编译时问题,报告我的类Donald不符合ProtocolX(根据规范,它要求var handler必须符合ProtocolA)。

从理论上讲,var handler IS符合ProtocolA(但它也符合ProtocolB)。

那么我的问题是:为什么编译时会发出? swift 局限还是我这方面的概念问题?

最佳答案

没有充分的理由说明它不起作用,只是编译器尚不支持。

当前,ProtocolX指定该处理程序必须为ProtocolA类型,这意味着,如果您为该处理程序声明类Donald而不是ProtocolA类型,则它将不满足协议(protocol)的要求。

但是,您可以将处理程序指定为ProtocolA类型,但将其设置为ProtocolA & ProtocolB类型的属性。在这种情况下,该属性将强制转换为ProtocolA,并且您需要执行其他强制转换才能使用ProtocolB的属性。例如:

typealias ProtocolAB = ProtocolA & ProtocolB

class AB: ProtocolAB {
    func doSomethingA() {}
    func doSomethingB() {}
}

class Donald: ProtocolX {
    var handler: ProtocolA {
        return AB()
    }

    func f() {
        handler.doSomethingA() // is valid
        handler.doSomethingB() // is not valid without casting the handler as `ProtocolB`
    }
}

关于Swift 4协议(protocol)组成一致性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46955159/

10-12 01:53