我有一个协议,它符合。
protocol FnProtocol {
}
extension Int: FnProtocol {
}
extension String: FnProtocol {
}
然后我创建了一个函数
FnProtocol
,它以String
作为参数。func f3(_ x: FnProtocol) -> FnProtocol {
return x
}
接下来,
Int
函数接受一个在f3
上工作的函数数组。func comp(fns: [(FnProtocol) -> FnProtocol]) -> (FnProtocol) -> FnProtocol {
return fns[0]
}
func count(_ s: String) -> Int {
return s.count
}
考虑到
FnProtocol
和comp
符合FnProtocol
,为什么String
失败而Int
有效?comp(fns: [count]) // Cannot convert value of type '(String) -> Int' to expected element type '(FnProtocol) -> FnProtocol'
如何使用
FnProtocol
? 最佳答案
为了能够使用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
}
}