2016-02-12 3 views
5

Предположим следующую игрушку пример: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() на нем, реализация которых будет называться? Зачем?

Я считаю, что это определено во время компиляции; другими словами, это не динамическая отправка. Но как это определяется? Такое ощущение, что это было бы похоже на правила вокруг расширения протокола, но это динамичная диспетчерская ситуация ...

+1

'AwesomeType' - более конкретный тип, чем' Equatable', поскольку он расширяет 'Equatable', поэтому я ожидаю, что он« выиграет ». Ты это пробовал? – rickster

+1

Я ожидаю, что компилятор уступит и ошибся над вырожденными кандидатами. (Как это было, когда я действительно не продумал дополнение '=' функции, которое я сделал некоторое время назад). – dfri

+1

Я ожидал чего-то подобного и получил его: «error: неоднозначное использование« doThing() ». Это определяется во время компиляции. – ColGraff

ответ

5

Это дает

error: ambiguous use of 'doThing()'

Используя просто модифицированный пример:

protocol AwesomeType: Equatable { } 

extension Array where Element: Equatable { 
    func doThing() { print("array one") } 
} 

extension Array where Element: AwesomeType { 
    func doThing() { print("array two") } 
} 

extension String: AwesomeType { } 

let arr = [ "Foo", "Bar", "Baz" ] 

arr.doThing() 

Компилятор жалуется

error: ambiguous use of 'doThing()'

note: found this candidate
func doThing() { print("array one") }

note: found this candidate
func doThing() { print("array two") }

Компилятор просто не знает, поскольку оба метода имеют одинаковое имя и параметры.

Наличие нескольких методов, названных одинаковыми, но не связанных с ними, всегда создает риск некоторых проблем с компилятором, когда они в конечном итоге перекрываются в какой-то точке.

+0

Да, это правильно. Я более упростил код, который, как предполагается, представляет собой более сложную проблему, над которой я работаю. (D'ах!) – edelaney05

Смежные вопросы