Zobacz przykład poniżej zawierający. Kompilator zgłasza błąd w ostatnim wierszu (oznaczonym jako COMPILE ERROR
), w którym przypisuję instancję SimpleTrain
do typu protokołu, który jest zgodny z moją najlepszą oceną. Jak mogę go skompilować? Co ja robię źle? Czy jest to problem z kompilatorem?Nie można przypisać instancji klasy do jej typu protokołu?
protocol Train {
typealias CarriageType
func addCarriage(carriage: CarriageType)
func shortTrain<ShortType: Train where ShortType.CarriageType == CarriageType>() -> ShortType
}
class SimpleTrain<T> : Train {
typealias CarriageType = T
private var carriages: [T] = [T]()
func addCarriage(carriage: T) {
carriages.append(carriage)
}
func shortTrain<ShortType: Train where ShortType.CarriageType == CarriageType>() -> ShortType {
let short = SimpleTrain<T>()
short.addCarriage(carriages[0])
return short //COMPILE ERROR: SimpleTrain<T> is not convertible to 'ShortType'
}
}
EDIT: Nawet kiedy wyraźnie przybity przez shortTrain
„s typ zwracany powyżej (tak, że ostatnia linia fragmencie kodu powyżej odczytuje return short as ShortType
) jako suggested by Antonio wciąż jest kompilacja błąd podczas funkcję shortTrain
wywołanie:
let s = SimpleTrain<String>()
s.addCarriage("Carriage 1")
s.addCarriage("Carriage 2")
let a = s.shortTrain() //ERROR: Cannot convert the expression's type '()' to type 'Train'
let b = s.shortTrain<SimpleTrain<String>>() //ERROR: cannot explicitly specialize a generic function
Dziękuję za tę odpowiedź Rob. Odpowiedział na wszystkie moje pytania (w tym niektóre, które mogłem zapytać gdzie indziej w przyszłości, na przykład o tym, co sądzą o tym członkowie zespołu Swift). Niestety, nie mogę podać żadnych bardziej szczegółowych informacji. Podałem sztuczny przykład, aby usunąć wszystkie informacje związane z biznesem. Jednak podany przykład jest tak bliski jak to tylko możliwe i stwierdzam, że produkt jest biblioteką i nie mogę wymagać, aby użytkownicy wyraźnie określili typ dla wielu wywołań metod. Znalazłem inny sposób. Wciąż byłyby to dobre protokoły z otwartymi aliasami typów do użycia jako typy – drasto