Не можете присвоить экземпляр класса его типу протокола?
Пожалуйста, посмотрите самодостаточный пример ниже. Компилятор сообщает об ошибке в последней строке (отмеченоCOMPILE ERROR
) где я назначаю экземплярSimpleTrain
типу протокола, которому он (по моему мнению) соответствует. Как я могу сделать это скомпилировать? Что я делаю неправильно? Или это проблема с компилятором?
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'
}
}
РЕДАКТИРОВАТЬ: Даже когда я явно удручаюshortTrain
возвращаемый тип выше (так что последняя строка кода выше читаетreturn short as ShortType
) какпредложенный Антонио все еще есть ошибка компиляции при вызове функцииshortTrain
:
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