Si prega di vedere l'esempio contenente il sé di seguito. Il compilatore segnala un errore sull'ultima riga (contrassegnata da COMPILE ERROR
) dove sto assegnando un'istanza di SimpleTrain
a un tipo di protocollo a cui è conforme (a mio giudizio). Come posso compilarlo? Che cosa sto facendo di sbagliato? O è questo problema del compilatore?Impossibile assegnare un'istanza di classe al suo tipo di protocollo?
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: Anche quando ho abbattuto esplicitamente s il shortTrain
' tipo di ritorno al di sopra (in modo che l'ultima riga di codice frammento di sopra si legge return short as ShortType
) come suggested by Antonio c'è ancora errore di compilazione quando si chiama la funzione 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
Grazie per questa risposta Rob. Ha risposto a tutte le mie domande (incluse alcune che avrei potuto chiedere altrove in futuro, ad esempio cosa ne pensa il team di Swift). Purtroppo, non posso fornire ulteriori informazioni specifiche. Ho fornito un esempio artificiale per cancellare tutte le informazioni relative al business. Tuttavia, l'esempio fornito è il più vicino possibile e dichiaro che il prodotto è una libreria e difficilmente posso richiedere agli utenti di specificare il tipo esplicitamente per molte chiamate di metodo. Ho trovato un altro modo per aggirare. I protocolli ancora con alias di tipo aperto da utilizzare come tipi sarebbero grandiosi – drasto