2015-08-19 26 views
38

如何范围转换成数组迅速转换范围<Int>为[INT]

我想:

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] 

他们也不工作。

回答

81

您需要使用Range<Int>而不是至来创建Array<Int>

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

感谢,我只是想通它虽然你发送你的答案 –

10

我想通了:

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

给予赞扬别人。

7

使用map

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

增加为什么它的作品将有利于阅读这类问题的人。例如,声明它创建了一个实现序列协议的CoutableClosedRange,因此映射是可能的,并且在执行映射操作时会产生一个新的int。 一些背景知识总是很好 – denis631

21

把范围在init。

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

做:

let intArray = Array(min...max) 

这应该工作,因为Array有一个初始化采取SequenceTypeRange符合SequenceType

1

有趣的是你不能(至少与夫特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) 

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

+0

原因是因为范围不是集合。 Range和Countable Range之间的区别在于后者可以通过Integer值迭代。出于这个原因,可数范围是一个快速收集类型,但范围不是。 –

+0

这是对的,我并不期待这个,即两个不同的范围类别。可能是由于范围()的Pythonic解释。 – devforfu

1

由于夫特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) 
} 
+0

这是(现在)处理任务的正确方法。也适用于Swift 4。 – Ash