【问题标题】:Retrieving a fixed amount of data from a Swift Array从 Swift 数组中检索固定数量的数据
【发布时间】:2015-12-22 22:05:27
【问题描述】:

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

不能下标 [int] 类型的值

【问题讨论】:

  • 通过toPlotLines[0..<n],您将返回原始数组的ArraySlice。你可以把它包装成一个普通的Array 类型。

标签: swift


【解决方案1】:

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

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

要创建“真实数组”,请使用

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

【讨论】:

    【解决方案2】:

    Array&lt;Int&gt;ArraySlice&lt;Int&gt;

    下标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&lt;Int&gt;Array&lt;Int&gt;

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

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

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

    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&lt;Int&gt;Array&lt;String&gt;

    因为ArraySlice符合SequenceType,所以可以在其上使用map(或其他函数方法,如filterreduce)。因此,您不仅可以从ArraySlice&lt;Int&gt; 获得Array&lt;Int&gt;:您还可以从ArraySlice&lt;Int&gt; 获得Array&lt;String&gt;(或任何其他有意义的数组类型)。

    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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多