我有一个对泛型集合进行操作的函数:
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 :(得分: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
{
// ...
}