紧凑的Swift Generic Collection的紧凑化

时间:2016-10-22 07:20:19

标签: swift generics collections

我有一个对泛型集合进行操作的函数:

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背后的所有子句吗?

  • 如果没有,是否有解决此问题的提案?

1 个答案:

答案 0 :(得分: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
{
   // ...
}