Supponiamo per esempio che stiamo parlando di elementi di tipo Int (ma la questione si applica ancora a qualsiasi tipo)Definire un protocollo di Swift che richiede un tipo specifico di sequenza
ho alcune funzionalità che deve ciclare su un sequenza di Ints. Ma non mi interessa se dietro le quinte questa sequenza è implementata come una matrice, un set o qualsiasi altro tipo di struttura esotica, l'unico requisito è che possiamo ricollegarli.
La libreria standard Swift definisce il protocollo SequenceType come "Un tipo che può essere iterato con un per ... in loop". Quindi il mio istinto è di definire un protocollo come questo:
protocol HasSequenceOfInts {
var seq : SequenceType<Int> { get }
}
Ma questo non funziona. SequenceType non è un tipo generico che può essere specializzato, è un protocollo. Ogni particolare SequenceType fa hanno uno specifico tipo di elemento, ma è disponibile solo come un tipo associato: SequenceType.Generator.Element
Quindi la domanda è:
Come possiamo definire un protocollo che richiede una tipo specifico di sequenza?
Ecco alcune altre cose che ho provato e perché non sono di destra:
Fail 1
protocol HasSequenceOfInts {
var seq : SequenceType { get }
}
protocollo 'SequenceType' può essere utilizzato solo come un vincolo generico perché ha i requisiti di tipo Self o associati
Fail 2
protocol HasSequenceOfInts {
var seq : AnySequence<Int> { get }
}
class ArrayOfInts : HasSequenceOfInts {
var seq : [Int] = [0,1,2]
}
ho pensato che questo avrebbe funzionato, ma quando ho provato un'implementazione concreta utilizzando una matrice otteniamo
'ArrayOfInts' Tipo non è conforme al protocollo 'HasSequenceOfInts'
Questo perché Array non è AnySequence (con mia grande sorpresa ... la mia aspettativa era che AnySequence sarebbe partita qualsiasi sequenza di INT)
Fail 3
protocol HasSequenceOfInts {
typealias S : SequenceType
var seq : S { get }
}
compila, ma non c'è l'obbligo che gli elementi della sequenza SEQ hanno tipo Int
Fail 4
protocol HasSequenceOfInts {
var seq : SequenceType where S.Generator.Element == Int
}
non può utilizzare un dove clausola
Quindi no w Sono totalmente privo di idee. Posso facilmente fare in modo che il mio protocollo richieda un array di Int, ma poi sto limitando l'implementazione senza una buona ragione, e questo mi sembra molto poco rapido.
Aggiornamento Successo
See risposta da @ rob-Napier che spiega le cose molto bene. My Fail 2 era abbastanza vicino. Usare AnySequence può funzionare, ma nella tua classe conforme devi assicurarti di convertire da AnySequence qualunque tipo di sequenza tu stia utilizzando. Per esempio:
protocol HasSequenceOfInts {
var seq : AnySequence<Int> { get }
}
class ArrayOfInts : HasSequenceOfInts {
var _seq : [Int] = [0,1,2]
var seq : AnySequence<Int> {
get {
return AnySequence(self._seq)
}
}
}
"... il mio istinto è definire un protocollo come ...". il mio istinto mi impone di definire il mio oggetto (o protocollo) come conforme a SequenceType – user3441734
@ user3441734 - Non sono sicuro di quale sia il tuo suggerimento. Puoi fare un esempio? –