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)
然后,在我的ProtocolX的类中有一个正确的实现,如下所示:
然后一切正常并正确满足了协议(protocol)要求。
但
如果我这样实现:
我遇到一个编译时问题,报告我的类
从理论上讲,var
那么我的问题是:为什么编译时会发出? swift 局限还是我这方面的概念问题?
(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