Я получил этот код:
protocol Protocol {
var id: Int { get }
}
extension Array where Element: Protocol {
func contains(_protocol: Protocol) -> Bool {
return contains(where: { $0.id == _protocol.id })
}
}
class Class {
func method<T: Protocol>(_protocol: T) {
var arr = [Protocol]()
// Does compile
let contains = arr.contains(where: { $0.id == _protocol.id })
// Doens't compile
arr.contains(_protocol: _protocol)
}
}
Почему строка кода не компилируется, где я прокомментировал «Не компилировать»?Это ошибка:
Incorrect argument label in call (have '_protocol:', expected 'where:')
Когда я изменяю имя метода в расширении на что-то другое, например containz
(и, конечно, меняю имя метода, который вызывает его на containz
), япоявляется эта ошибка, когда я пытаюсь вызвать ее:
Using 'Protocol' as a concrete type conforming to protocol 'Protocol' is not supported
Но почему она не работает, когда я пытаюсь вызвать ее через расширение, но работает, когда я создаю функцию в расширении напрямую?На самом деле я не вижу никакой разницы.