Предположим следующую игрушку пример:Swift Generics - Какой метод называется?
protocol AwesomeType: Equatable {
var thingy: Int { get }
}
extension Array where Element: Equatable {
func doThing { ... }
}
extension Array where Element: AwesomeType {
func doThing { ... }
}
extension String: AwesomeType {
var thingy: Int { return 42 }
}
Если у меня есть массив String
с - [ "Foo", "Bar", "Baz" ]
- и я называю doThing()
на нем, реализация которых будет называться? Зачем?
Я считаю, что это определено во время компиляции; другими словами, это не динамическая отправка. Но как это определяется? Такое ощущение, что это было бы похоже на правила вокруг расширения протокола, но это динамичная диспетчерская ситуация ...
'AwesomeType' - более конкретный тип, чем' Equatable', поскольку он расширяет 'Equatable', поэтому я ожидаю, что он« выиграет ». Ты это пробовал? – rickster
Я ожидаю, что компилятор уступит и ошибся над вырожденными кандидатами. (Как это было, когда я действительно не продумал дополнение '=' функции, которое я сделал некоторое время назад). – dfri
Я ожидал чего-то подобного и получил его: «error: неоднозначное использование« doThing() ». Это определяется во время компиляции. – ColGraff