给定没有任何功能的协议:
protocol NonFunkyProtocol {}
以及一个带有严重缺陷的协议:
protocol FunkyProtocol {
func funky<T: NonFunkyProtocol>(_ closure: (T) -> Void)
}
然后给出这个结构:
struct WeeStruct: FunkyProtocol {
let weeProp: NonFunkyProtocol
func funky<T>(_ closure: (T) -> Void) where T: NonFunkyProtocol {
closure(weeProp)
}
}
我希望将其编译为预期的参数类型closure
为T,其中T符合NonFunkyProtocol,并且weeProp
类型为NonFunkyProtocol。
相反,我看到此错误:
我的仿制药知识中很可能有一个漏洞,我在哪里出错?
问题是T
在这种情况下是“某种符合NonFunkyProtocol
”的类型。weeProp
也是“符合的东西NonFunkyProtocol
”,但是没有什么可以说weeProp
是那种T
。
考虑以下情况:
extension Int: NonFunkyProtocol {}
extension String: NonFunkyProtocol {}
Int和String都符合。
现在,我用一个字符串构造一个WeeStruct:
let wee = WeeStruct(weeProp: "")
我funky
使用需要一个Int的函数进行调用(因为Int是一个符合类型,所以可以是T
):
wee.funky { (int: Int) -> Void in print(int + 1) }
因此,这将传递""
给闭包。那怎么行?
因此,您要么需要任何 关闭句柄NonFunkyProtocol
(我就强烈怀疑这是您的意思):
func funky(_ closure: (NonFunkyProtocol) -> Void)
或者你需要向下钉weeProp
到T
通过使T
一个associatedtype:
protocol FunkyProtocol {
associatedtype T: NonFunkyProtocol
func funky(_ closure: (T) -> Void)
}
struct WeeStruct<T:NonFunkyProtocol>: FunkyProtocol {
let weeProp: T
func funky(_ closure: (T) -> Void) {
closure(weeProp)
}
}
不过,在添加关联类型之前,我会非常小心。这完全改变了FunkyProtocol的性质。
如果FunkyProtocol确实只是这一要求,那么您还应该问它要解决的是什么,而不仅仅是功能。WeeStruct
当您可以直接使用该wee.funky
功能时,为什么要随身携带所有协议包呢?FunkyProtocol上有协议扩展吗?如果您不能针对FunkyProtocol编写通用算法,则可能不应该是协议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句