gpt4 book ai didi

swift - Swift Generic Collection 的紧凑化 where constraint

转载 作者:搜寻专家 更新时间:2023-11-01 06:37:07 25 4
gpt4 key购买 nike

我有一个对通用集合进行操作的函数:

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 子句隐藏在 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
{
// ...
}

关于swift - Swift Generic Collection 的紧凑化 where constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40189445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com