将Swift中的Range<Int>转换为[Int]

158

如何将Range转换为Array

我尝试过:

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

收到错误:Range<Int>无法转换为[Int]

我也尝试了:

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

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

他们也不起作用。

8个回答

315
您需要使用 Range<Int> 创建一个 Array<Int>,而不是进行强制转换。
let intArray: [Int] = Array(min...max)

1
谢谢,我在你回答的时候已经想到了。 - haitham

46
将范围放在初始化中。
let intArray = [Int](min...max)

完美!谢谢@MrBeardsley - PhillipJacobs

18

我想通了:

let intArray = [Int](min...max)
将荣誉归于他人。

15

使用map

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

为那些阅读此类问题的人添加其工作原理会更有益。例如,说明它创建了一个实现Sequence协议的CoutableClosedRange,因此可以进行map操作,并在执行map操作时惰性地产生一个新的int。一些背景知识总是很好的。 - denis631
其他答案很有趣,但这个确实回答了问题。赞。 - Dan Rosenstark

15

做:

let intArray = Array(min...max)

这应该能正常工作,因为 Array 有一个接受 SequenceType 的初始化器,并且 Range 符合 SequenceType


4

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

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)

也就是说,你可以只使用文字。


这是因为Ranges不是Collections。Range和Countable Range之间的区别在于后者可以通过整数值进行迭代。因此,Countable Range是Swift中的集合类型,而Range不是。 - Corey Zambonie
没错,我也没想到会有两个不同的范围类。这可能是由于 Pythonic 对 range() 的解释造成的。 - devforfu

3
自从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

1
你可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接