Sto ancora combattendo con i generici di Swift. Oggi ho scoperto che la mia implementazione del protocollo Equitable non funziona, se è chiamata da una classe generica.L'implementazione equa non sembra funzionare con i generici
mia classe del modello:
func ==(lhs: Tracking, rhs: Tracking) -> Bool {
// This method never executes if called from BaseCache
return lhs.id == rhs.id
}
class Tracking: NSObject, Equatable, Printable {
var id: String?
.....
}
Classe, che utilizza tipo generico:
class BaseCache<T: NSObject where T: Equatable, T: Printable> {
.....
func removeEntities(entities: [T]) {
var indexesToRemove = [Int]()
for i in 0...allEntities.count - 1 {
let item = allEntities[i]
for entity in entities {
println("equal: \(entity == item)")
// FOR SOME REASONS THE STATEMENT BELOW IS ALWAYS FALSE
if entity == item {
indexesToRemove.append(i)
break
}
}
}
for index in indexesToRemove {
allEntities.removeAtIndex(index)
}
didRemoveEntities()
}
}
ed è sottoclasse:
class TrackingCache<T: Tracking>: BaseCache<Tracking> {
}
Quando chiamo removeEntities
metodo TrackingCache
esempio, ho sempre equal: false
nell'output, anche se id
s sono gli stessi.
Ma se sposto il metodo direttamente nella classe TrackingCache
, sembra funzionare bene!
Qualche idea del perché questo sta accadendo e come risolvere questo problema?
btw, invece di 'for i in 0 ... allEntities.count - 1' puoi scrivere' per i in 0 ..
A seconda di cosa sia "allEntities", puoi alternativamente dire "per oggetto in tutte le Entità" '. – matt
Ha bisogno di un indice, per guidare la rimozione più tardi. 'for (idx, item) in enumerate (allEntities)' funzionerebbe - si basa su indici 'Int', ma questo è il caso qui. –