我有var toPlotLines:[Int] = [200, 300, 400, 500, 600, 322, 435]
,我想从integers
检索前四个array
。我可以在不必循环进入Swift
的情况下这样做。我试过这个graphView.graphPoints = toPlotLines[0..<n]
,其中graphPoints
是empty integer array
,但我一直收到此错误:
无法下标类型[int]
的值
答案 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
(或其他功能方法,如filter
和reduce
)。因此,您不仅可以从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"]