2016-10-22 2 views
1

ich eine Funktion haben, die auf generische Sammlungen betreibt:Kompaktifizierung von Swift Allgemein Sammlung wo Einschränkung

func foo<T: RangeReplaceableCollection>(_ bar: T) 
    where T.Iterator.Element == UInt8 
{ 
    // 
} 

Die Funktion greift dann auf Teilbereiche dieser Sammlung, so braucht es zusätzliche Einschränkungen:

func foo<T: RangeReplaceableCollection>(_ bar: T) 
    where T.Iterator.Element == UInt8, 
      T.SubSequence: RangeReplaceableCollection, 
      T.SubSequence.Iterator.Element == T.Iterator.Element 
{ 
    // 
} 

Es ruft auch Funktionen auf, die selbst auf Unterbereichen der Unterbereiche der Sammlung arbeiten, so dass es noch mehr Einschränkungen benötigt:

func foo<T: RangeReplaceableCollection>(_ bar: T) 
    where T.Iterator.Element == UInt8, 
      T.SubSequence: RangeReplaceableCollection, 
      T.SubSequence.Iterator.Element == T.Iterator.Element, 
      T.SubSequence.SubSequence: RangeReplaceableCollection, 
      T.SubSequence.SubSequence.Iterator.Element == 
       T.SubSequence.Iterator.Element 
{ 
    // 
} 
  • Gibt es eine Möglichkeit, wie dies gereinigt werden kann?

  • Gibt es zumindest eine Möglichkeit, all die Where-Klauseln hinter einer typealias zu verstecken?

  • Wenn nicht, gibt es einen Vorschlag, der dieses Problem anspricht?

+0

Warum gibt es 'AnyRandomAccessCollection ' aber keine 'AnyRangeReplaceableCollection '? Würde auch das Problem lösen und alle Klauseln loswerden. – Etan

Antwort

3

Eine Sammlung Teilfolge nicht den gleichen Typen wie die Sammlung zu haben braucht selbst, sondern - soweit ich weiß - die Teilfolge einer Teilfolge hat vom gleichen Typ wie die Teilfolge mich für alle Sammlungen definierte in die Standardbibliothek. Daher eine zusätzliche Einschränkung

T.SubSequence.SubSequence == T.SubSequence 

Ihr Problem für beliebig verschachtelt Teilfolgen lösen sollte:

func foo<T: RangeReplaceableCollection>(_ bar: T) 
    where T.Iterator.Element == UInt8, 
    T.SubSequence: RangeReplaceableCollection, 
    T.SubSequence.Iterator.Element == T.Iterator.Element, 
    T.SubSequence.SubSequence == T.SubSequence 
{ 
    // ... 
} 
+0

Super! ...... – Etan

+0

Irgendeine Chance für eine Typalias für den Fall, dass ich die gleichen Einschränkungen für mehrere Funktionen haben möchte? – Etan

Verwandte Themen