2014-09-19 23 views
5

Desidero digitare typealias un dizionario di chiavi String e valori di oggetti/strutture che implementano il protocollo Equatable. Così ho scritto questa riga di codice, ma mi ha dato errore che non sapevo come andare a risolvere.Swift - Dizionario Typealias con valore che implementa un protocollo generico

typealias Storage = [String: Equatable] 

voglio utilizzare il tipo [String: equatable] come variabile in un protocollo, ad esempio:

protocol StorageModel { 
    var storage: Storage { get set } 
    init(storage: Storage) 
} 

Errore:

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements

enter image description here Qualcuno può suggerire una soluzione ?

risposta

5

In generale, non è richiesto il tag protocollo, nomi di protocollo sono i nomi dei tipi di prima classe e possono essere utilizzati direttamente:

typealias Storage = [String:Equatable] 

In questo caso, ciò che l'errore sta dicendo è che a causa equatable include func == (lhs:Self, rhs:Self) -> Bool e specificatamente lhs:Self, equatable non può essere utilizzato se non come un vincolo su un generico:

class Generic<T:Equatable> { ... } 

senza ulteriori dettagli su ciò che si sta cercando di raggiungere e come si sta cercando di usare StorageModel, il migliore Posso venire è:

protocol Matches { 
    typealias T 
    func matches(t:T) -> Bool 
} 

protocol StorageModel { 
    typealias T 
    var storage: [String:T] { get set } 
    init(storage:[String:T]) 
} 

extension Int : Matches { 
    func matches(target:Int) -> Bool { 
     return self == target 
    } 
} 

class MyClass <T:Matches> { 
    var model = [String:T]() 


} 

Un'altra possibilità è quella di utilizzare un generico al posto di un protocollo:

class StorageModel <T:Equatable> { 
    var storage: [String:T] 

    init(storage:[String:T]) { 
     self.storage = storage 
    } 
} 

Da lì è necessario fare qualche ricerca, scavare nel manuale di Swift, fare un po 'googling e vedere ciò che risolve il tuo problema

+0

Come dovrei ottenere questo in altre parole? –

+1

A causa di come è definito Equitable, non penso che sia possibile senza definire il proprio protocollo che assomigli molto a Equitable, e anche allora penso che incontrerai lo stesso problema. La soluzione migliore potrebbe essere quella di definire un nuovo protocollo che definisca un metodo equals e utilizzarlo. –

+0

Ho appena aggiornato la domanda, potresti aiutarmi con come posso risolvere il problema? –

Problemi correlati