2016-10-22 48 views
1

我有一個關於泛型集合進行動作的功能的緊化:斯威夫特泛型集合,其中約束

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

函數然後訪問該集合的子範圍,所以它需要額外的約束:

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

它也稱爲自己在集合子範圍的子範圍內操作的函數,因此它需要更多的約束:

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 
{ 
    // 
} 
  • 有沒有什麼辦法可以清理?

  • 難道至少有一種方法可以隱藏所有那些在typealias後面的子句嗎?

  • 如果不是,是否有解決此問題的提案?

+0

爲什麼會出現'AnyRandomAccessCollection '但沒有'AnyRangeReplaceableCollection '?也將解決問題並擺脫所有條款。 – Etan

回答

3

一個集合序列不必具有相同的類型集合 本身,而是 - 據我所知 - 子序列的子序列具有 相同類型的子序列本身對所有集合定義 在標準庫。因此一個附加約束

T.SubSequence.SubSequence == T.SubSequence 

應該解決您的問題進行任意嵌套子序列:

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

太棒了! ...... – Etan

+0

如果我想在多個函數上具有相同的約束條件,任何機會都可以使用typealias? – Etan