我有一个协议FnProtocol
,String
和Int
符合。
protocol FnProtocol {
}
extension Int: FnProtocol {
}
extension String: FnProtocol {
}
然后我创建了一个函数f3
,该函数以FnProtocol
作为参数。
func f3(_ x: FnProtocol) -> FnProtocol {
return x
}
接下来,comp
函数接受一系列在FnProtocol
上运行的函数。
func comp(fns: [(FnProtocol) -> FnProtocol]) -> (FnProtocol) -> FnProtocol {
return fns[0]
}
func count(_ s: String) -> Int {
return s.count
}
考虑到String
和Int
符合FnProtocol
,为什么comp(fns: [count])
失败但comp(fns: [f3])
有效?
comp(fns: [count]) // Cannot convert value of type '(String) -> Int' to expected element type '(FnProtocol) -> FnProtocol'
如何与count
一起使用?
答案 0 :(得分:1)
要使用count()
,需要使用FnProtocol
作为参数
func count(_ s: FnProtocol) -> Int {
return s.count
}
当然,这意味着我们需要修改协议并使其遵守Int
protocol FnProtocol {
var count: Int {get}
}
extension Int: FnProtocol {
var count: Int {
return String(self).count
}
}