快速将Range <Int>转换为[Int]


107

如何将范围转换为数组

我试过了:

let min = 50
let max = 100
let intArray:[Int] = (min...max)

得到错误 Range<Int> is not convertible to [Int]

我也尝试过:

let intArray:[Int] = [min...max]

let intArray:[Int] = (min...max) as [Int] 

他们也不工作。

Answers:


202

你需要创建一个Array<Int>使用Range<Int>,而不是荷兰国际集团它。

let intArray: [Int] = Array(min...max)

1
谢谢,我只是在您发送答案
时才

如果范围很大,这似乎会崩溃:let valuesArray:[Int64] = Array(1 ... 4294967292)-也许是因为它只能处理Int而不能处理Int64?
丹尼尔·史普林格'18

2
@DanielSpringer:不是引起问题的Array中的值,而是索引超出了语言规范中确定的范围。请计算您需要多少RAM,仅用于容纳这个巨大的阵列。
用户不知道

@userunknown所以不是值的类型,而是值的数量?知道了,谢谢!
丹尼尔·斯普林格

1
@Daniel斯普林格,这听起来像一个任务,你一定要使用RandomGenerator,看到一些选项在这里:hackingwithswift.com/articles/102/...
克劳斯·布斯


14

我想到了:

let intArray = [Int](min...max)

赞扬别人。


13

做:

let intArray = Array(min...max)

这应该起作用,因为Array有一个采用SequenceTypeRange符合的初始化程序SequenceType


10

map

let min = 50
let max = 100
let intArray = (min...max).map{$0}

添加为何有效对阅读此类问题的人来说是有益的。例如,声明它创建一个实现Sequence协议的CoutableClosedRange,因此映射是可能的,并且在执行映射操作时它会延迟生成一个新的int。一些背景知识总是好的
denis631

其他答案很有趣,但这实际上回答了这个问题。大起来
Dan Rosenstark

3

有趣的是,您不能(至少在Swift 3和Xcode 8中)不能Range<Int>直接使用对象:

let range: Range<Int> = 1...10
let array: [Int] = Array(range)  // Error: "doesn't conform to expected type 'Sequence'"

因此,如前所述,您需要手动“解包”您的范围,例如:

let array: [Int] = Array(range.lowerBound...range.upperBound)

即,您只能使用文字。


这样做的原因是,范围不是集合。Range和Countable Range之间的区别在于后者可以通过Integer值进行迭代。因此,“可计数范围”是快速收集的类型,但范围不是。
Corey Zambonie

没错,我没想到这一点,即两个不同的范围类。可能是由于Python的解释range()
devforfu

1

自Swift 3 / Xcode 8起就有一种CountableRange类型,可以方便使用:

let range: CountableRange<Int> = -10..<10
let array = Array(range)
print(array)
// prints: 
// [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

它可以直接在for- in循环中使用:

for i in range {
    print(i)
}

这(现在)是处理任务的正确方法。也可以在Swift 4中使用
。– Ash

0

您可以在类似这样的函数中使用reduce()实现ClosedRange&Range实例间隔。

func sumClosedRange(_ n: ClosedRange<Int>) -> Int {
    return n.reduce(0, +)
}
sumClosedRange(1...10) // 55


func sumRange(_ n: Range<Int>) -> Int {
    return n.reduce(0, +)
}
sumRange(1..<11) // 55
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.