zum Beispiel Angenommen, wir reden über Elemente vom Typ Int (aber die Frage immer noch gilt für jede Art)Definieren Sie ein Swift-Protokoll, das eine bestimmte Art von Sequenz erfordert
ich einige Funktionen haben, die über eine Schleife benötigt Sequenz von Inten. Aber es ist mir egal, ob hinter den Kulissen diese Sequenz als ein Array oder ein Set oder irgendeine andere exotische Art von Struktur implementiert ist, die einzige Voraussetzung ist, dass wir sie überschleifen können.
Die Swift-Standardbibliothek definiert das Protokoll SequenceType als "Ein Typ, der mit einer for ... in-Schleife iteriert werden kann". Also mein Instinkt ist ein Protokoll wie folgt zu definieren:
protocol HasSequenceOfInts {
var seq : SequenceType<Int> { get }
}
Aber das funktioniert nicht. SequenceType ist kein generischer Typ, der spezialisiert werden kann, sondern ein Protokoll. Jede bestimmte SequenceType tut eine bestimmte Art von Element haben, aber es ist nur als assoziiertes Typ: SequenceType.Generator.Element
Die Frage ist also:
Wie können wir ein Protokoll definieren, die ein erfordert bestimmte Art der Sequenz?
Hier einige andere Dinge, die ich versucht habe und warum sie nicht richtig:
Ausfallen 1
protocol HasSequenceOfInts {
var seq : SequenceType { get }
}
Protokoll ‚SequenceType‘ kann nur als generische Einschränkung verwendet werden da es sich um Selbst- oder zugehörige Typanforderungen handelt
Ausfallen 2
protocol HasSequenceOfInts {
var seq : AnySequence<Int> { get }
}
class ArrayOfInts : HasSequenceOfInts {
var seq : [Int] = [0,1,2]
}
Ich dachte, das würde man arbeiten, aber wenn ich eine konkrete Umsetzung unter Verwendung eines Array versucht, bekommen wir
Typ ‚ArrayOfInts‘ entspricht nicht Protokoll ‚HasSequenceOfInts‘
Dies liegt daran, Array nicht AnySequence ist (zu meiner Überraschung ... war meine Erwartung, dass AnySequence würde jede Folge von Ints entsprechen)
Ausfallen 3
protocol HasSequenceOfInts {
typealias S : SequenceType
var seq : S { get }
}
Compiliert, aber es gibt keine Verpflichtung, dass die Elemente der Folge Seq Typ Int
Ausfallen 4
protocol HasSequenceOfInts {
var seq : SequenceType where S.Generator.Element == Int
}
Kann kein haben verwenden Wo gibt es dort
Also nein w Ich habe keine Ideen mehr. Ich kann einfach mein Protokoll ein Array von Int erfordern, aber dann beschränke ich die Implementierung ohne guten Grund, und das fühlt sich sehr unflexibel an.
aktualisieren Erfolg
Siehe Antwort von @ rob-napier, die Dinge sehr gut erklärt. Mein Fail 2 war ziemlich nah dran. Die Verwendung von AnySequence kann funktionieren, aber in der entsprechenden Klasse müssen Sie sicherstellen, dass Sie jede Art von Sequenz, die Sie verwenden, in AnySequence konvertieren. Zum Beispiel:
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)
}
}
}
"... mein Instinkt ist es, ein Protokoll wie ... zu definieren". Mein Instinkt diktiert mir, mein eigenes Objekt (oder Protokoll) so zu definieren, dass es dem SequenceType – user3441734
@ user3441734 entspricht - ich bin mir nicht sicher, wie du Suggestion hilfst. Kannst du ein Beispiel geben? –