Si consideri il seguente parco giochi:Swift Protocollo di eredità e generiche funzioni
import Foundation
protocol StringInitable {
init(string:String)
}
class A : StringInitable {
var stored:String
required init (string:String) {
stored = string
}
}
class B : A /*, StringInitable */ {
var another_stored:String
required init (string:String) {
another_stored = "B-store"
super.init(string: string)
}
}
func maker<T:StringInitable>(string:String) -> T {
return T(string: string)
}
let instanceA = A(string: "test-maker-A")
let instanceB = B(string: "test-maker-B")
let makerA:A = maker("test-maker-A")
let makerB:B = maker("test-maker-B")
let typeInstanceA = _stdlib_getTypeName(instanceA)
let typeMakerA = _stdlib_getTypeName(makerA)
let typeInstanceB = _stdlib_getTypeName(instanceB)
let typeMakerB = _stdlib_getTypeName(makerB)
Dai risultati del compilatore sembra aver dedotto i tipi corretti, ma non è riuscita a chiamare i inizializzatori corretti. Come mai devo implementare in modo esplicito StringInitable nella classe B (test rimuovendo il commento nella definizione della classe B) per fare in modo che la funzione generica "maker" chiami l'inizializzatore corretto?
Ha funzionato per me una volta aggiunto l'identificatore "richiesto" davanti alla funzione init. – user965972