我有一个协议,它符合。

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
}

考虑到FnProtocolcomp符合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
    }
}

10-08 07:43