从Swift数组中检索固定数量的数据

时间:2015-12-22 22:05:28

标签: swift

我有var toPlotLines:[Int] = [200, 300, 400, 500, 600, 322, 435],我想从integers检索前四个array。我可以在不必循环进入Swift的情况下这样做。我试过这个graphView.graphPoints = toPlotLines[0..<n],其中graphPointsempty integer array,但我一直收到此错误:

  

无法下标类型[int]

的值

2 个答案:

答案 0 :(得分:5)

错误消息具有误导性。问题是toPlotLines[0 ..< n] 不是Array,而是ArraySlice

  

类似Array的类型,表示任何Array,ContiguousArray或其他ArraySlice的子序列。

要创建&#34;真实阵列&#34;,请使用

graphView.graphPoints = Array(toPlotLines[0 ..< n])

答案 1 :(得分:1)

Array<Int>ArraySlice<Int>

当您下标到Array时,返回的对象的类型为ArraySlice

let toPlotLines = [200, 300, 400, 500, 600, 322, 435] // type: [Int]
let arraySlice = toPlotLines[0 ..< 4] // type: ArraySlice<Int>

您可以使用ArraySlice Structure Reference详细了解ArraySlice

ArraySlice<Int>Array<Int>

一方面,ArraySlice符合从CollectionType继承自己的SequenceType协议。另一方面,Array具有初始化程序init(_:),其声明如下:

init<S : SequenceType where S.Generator.Element == _Buffer.Element>(_ s: S)

因此,您可以轻松地从Array获得新的ArraySlice

let toPlotLines = [200, 300, 400, 500, 600, 322, 435]
let arraySlice = toPlotLines[0 ..< 4]
let newArray = Array(arraySlice)
print(newArray) // prints: [200, 300, 400, 500]

ArraySlice<Int>Array<String>

由于ArraySlice符合SequenceType,您可以使用map(或其他功能方法,如filterreduce)。因此,您不仅可以从Array<Int>获得ArraySlice<Int>:您可以从Array<String>获得ArraySlice<Int>(或任何其他有意义的阵列类型)。

let toPlotLines = [200, 300, 400, 500, 600, 322, 435]
let arraySlice = toPlotLines[0 ..< 4]
let stringArray = arraySlice.map { String($0) }
print(stringArray) // prints: ["200", "300", "400", "500"]