2016-02-12 12 views
5

Si supponga che il seguente esempio giocattolo:Swift Generics: quale metodo viene chiamato?

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

Se ho una serie di String s - [ "Foo", "Bar", "Baz" ] - e chiamare doThing() su di esso, quale implementazione si chiamerà? Perché?

Credo che questo sia determinato al momento della compilazione; in altre parole non è una spedizione dinamica. Ma come è determinato? Ci si sente come sarebbe simile alle regole intorno estensioni di protocollo, ma questa è una situazione dinamica dispaccio ...

+1

'AwesomeType' è un tipo più specifico di' Equitable', poiché estende 'Equatable', quindi mi aspetterei che" vinca ". L'hai provato? – rickster

+1

Mi aspetto che il compilatore produca un errore rispetto ai candidati degenerati. (Come ha fatto quando non pensavo davvero attraverso una funzione = = 'aggiunta, ho fatto un po 'di tempo indietro). – dfri

+1

Mi aspettavo qualcosa del genere e l'ho capito: "errore: uso ambiguo di" doThing() "" Viene determinato al momento della compilazione. – ColGraff

risposta

5

produce un

error: ambiguous use of 'doThing()'

Utilizzando l'esempio semplicemente modificato:

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() 

Il compilatore si lamenta

error: ambiguous use of 'doThing()'

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

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

Il compilatore semplicemente non sa quale chiamata poiché i due metodi hanno nome e parametri identici.

Avere più metodi denominati uguali ma non effettivamente correlati pone sempre il rischio di alcuni problemi del compilatore quando i due si sovrappongono a un certo punto.

+0

Sì, questo è corretto. Ho semplificato il codice che suppongo rappresenti il ​​problema più complesso su cui sto lavorando. (D'oh!) – edelaney05