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 ...
'AwesomeType' è un tipo più specifico di' Equitable', poiché estende 'Equatable', quindi mi aspetterei che" vinca ". L'hai provato? – rickster
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
Mi aspettavo qualcosa del genere e l'ho capito: "errore: uso ambiguo di" doThing() "" Viene determinato al momento della compilazione. – ColGraff