Почему функция с протоколом в качестве аргумента не работает с расширениями типов, которые соответствуют тому же протоколу в Swift? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть протокол 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?

1 Ответ

1 голос
/ 06 июня 2019

Чтобы иметь возможность использовать 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
    }
}
...