2014-07-17 3 views
6

Mi piacerebbe essere in grado di dichiarare un protocollo come questo:accesso tipo di un protocollo personalizzato associato a una clausola in cui sui tipi generici a Swift

protocol TypedHashable { 

    typealias Type 

} 

e utilizzarlo in una clausola WHERE come questo:

class UsingTypedHashable<K: TypedHashable, V: TypedHashable where K.Type == V.Type> { 
    ... 
} 

per un motivo non riesco a vedere, il compilatore mi dà il seguente errore sotto il punto di "K.Type":

previsto ':' o '==' per indi Cate una conformità o lo stesso tipo di fabbisogno

Ho visto il codice utilizzando tipi associati dichiarati utilizzando tipealias nel protocollo che accede a quelle typealias nella clausola where per tipo assertion. Ecco un po 'di codice che compila e che fanno questo utilizzando la sequenza di protocollo standard Swift (e generatore ...):

func toArray<S : Sequence, 
     T where T == S.GeneratorType.Element> 
    (seq : S) -> T[] { 
    var arr = T[]() 
    for x in seq { 
     arr.append(x) 
    } 
    return arr 
} 

(Nota: il codice da https://schani.wordpress.com/author/schani/)

Il codice precedente utilizza la sequenza dichiarato associato tipo del protocollo Sequence il cui nome è "GeneratorType".

Qualche idea?

risposta

2

Il problema è che si sta utilizzando la parola riservata Type. Provalo con qualche altro nome come HashType e compila bene.

Vedere "metatipo Type" dalla Swift linguaggio di programmazione:

La metatipo di un tipo di classe, struttura o l'enumerazione è il nome di quel tipo seguita da .Type.

Probabilmente si dovrebbe ottenere un errore di compilazione sulla linea typealias piuttosto che la linea class, e si consiglia di aprire un radar su questo.

+0

Grazie, non capisco perché non l'ho visto, ma l'hai fatto! – sebastienhamel