为什么以协议为参数的函数不能与在Swift中符合相同协议的类型扩展一起使用?

时间:2019-06-06 07:59:53

标签: swift types swift-protocols

我有一个协议FnProtocolStringInt符合。

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
}

考虑到StringInt符合FnProtocol,为什么comp(fns: [count])失败但comp(fns: [f3])有效?

comp(fns: [count])  // Cannot convert value of type '(String) -> Int' to expected element type '(FnProtocol) -> FnProtocol'

如何与count一起使用?

1 个答案:

答案 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
    }
}