Arrays ClosedRange阵列<;Int>;和反向收集<;ClosedRange<;Int>&燃气轮机;

Arrays ClosedRange阵列<;Int>;和反向收集<;ClosedRange<;Int>&燃气轮机;,arrays,swift,collections,range,reverse,Arrays,Swift,Collections,Range,Reverse,我可以很容易地遍历封闭范围的元素。闭合范围的反转()元素同上。但是,这两种构造碰巧有不同的类型,例如前者的ClosedRange,以及reversecolection 假设我需要某种类型的集合(例如,一个数组),包括范围和反转范围:我该怎么做 例如: let aaa = 1...3 let bbb = (4...6).reversed() let ranges = [aaa,bbb] // heterogeneous collection literal could only be infer

我可以很容易地遍历封闭范围的元素。闭合范围的
反转()
元素同上。但是,这两种构造碰巧有不同的类型,例如前者的
ClosedRange
,以及
reversecolection

假设我需要某种类型的集合(例如,一个数组),包括范围和反转范围:我该怎么做

例如:

let aaa = 1...3
let bbb = (4...6).reversed()
let ranges = [aaa,bbb]  // heterogeneous collection literal could only be inferred of type '[Any]'
for range in ranges {
  for item in range {
    print(item)
  }
}

简单地将
范围
声明为
[Sequence]
[Collection]
类型是不起作用的,因为“协议“Sequence”只能用作一般约束,因为它具有自身或关联的类型要求.

您需要将所有元素转换为相同的类型,
Array
AnySequence
,具体取决于您的性能问题<代码>阵列将创建新的存储,但当顺序颠倒时,性能可能会更好
AnySequence
仅将操作转发到其基类,因此根据序列的大小,计算可能会比较复杂

让aaa=数组(1…3)
设bbb=Array((4…6).reversed())
让范围=[aaa,bbb]
对于范围中的范围{
适用于范围内的项目{
打印(项目)
}
}

根据性能问题,您需要将所有元素转换为相同类型的
Array
AnySequence
<代码>阵列将创建新的存储,但当顺序颠倒时,性能可能会更好
AnySequence
仅将操作转发到其基类,因此根据序列的大小,计算可能会比较复杂

让aaa=数组(1…3)
设bbb=Array((4…6).reversed())
让范围=[aaa,bbb]
对于范围中的范围{
适用于范围内的项目{
打印(项目)
}
}

您可以使用
任意序列

let aaa = AnySequence(1...3)
let bbb = AnySequence((4...6).reversed())
let ranges = [aaa, bbb] // ranges is [AnySequence<Int>]
for range in ranges {
  for item in range {
    print(item)
  }
}
让aaa=AnySequence(1…3)
设bbb=AnySequence((4…6).reversed())
让ranges=[aaa,bbb]//ranges是[AnySequence]
对于范围中的范围{
适用于范围内的项目{
打印(项目)
}
}

您可以使用
任意序列

let aaa = AnySequence(1...3)
let bbb = AnySequence((4...6).reversed())
let ranges = [aaa, bbb] // ranges is [AnySequence<Int>]
for range in ranges {
  for item in range {
    print(item)
  }
}
让aaa=AnySequence(1…3)
设bbb=AnySequence((4…6).reversed())
让ranges=[aaa,bbb]//ranges是[AnySequence]
对于范围中的范围{
适用于范围内的项目{
打印(项目)
}
}

两种解决方案的优缺点是什么?为什么是映射而不仅仅是数组()初始值设定项?我们是否在这里创建新存储(我似乎记得reversed()不会创建新存储,但这可能与范围无关)?
map
Array
都会创建新存储。我怀疑
AnySequence
只会将操作转发到它的基类,因此根据序列的大小,计算可能会比较复杂。@LeoDabus它比任何东西都不受欢迎。更新为使用
阵列
,这更合理两种解决方案的优缺点是什么?为什么是映射而不仅仅是数组()初始值设定项?我们是否在这里创建新存储(我似乎记得reversed()不会创建新存储,但这可能与范围无关)?
map
Array
都会创建新存储。我怀疑
AnySequence
只会将操作转发到它的基类,因此根据序列的大小,计算可能会比较复杂。@LeoDabus它比任何东西都不受欢迎。更新为使用更有意义的
数组