我有一个对通用集合进行操作的函数:
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
{
//
}
有什么办法可以清理吗?
是否至少有一种方法可以将所有where子句隐藏在a后面typealias
?
如果没有,是否有解决此问题的建议?
集合子序列不必与集合本身具有相同的类型,但就我所知,对于标准库中定义的所有集合,子序列的子序列与子序列本身具有相同的类型。因此,一个额外的约束
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
{
// ...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句