【问题标题】:Swift array struct快速数组结构
【发布时间】:2016-06-21 11:48:38
【问题描述】:

考虑:

struct abc {
    let def: Double 
}

func xyz(data : [Double]) {
    ...
}

var x: [abc]

我想用defx 的前6 个元素调用func xyz

我试过了:

xyz(x[0...5].def)

我该怎么做?

【问题讨论】:

  • 这个问题完全不清楚。不可能猜出您想要或需要做什么,特别是因为这里没有什么好名字(这对于Stack Overflow 问题通常很好,对于真实代码不好)。是否要多次调用 xyz 并使用名为 x 的结构数组中前六个元素上的数组?您想调用xyz 一次,并将数组的前六个元素上的数组的总内容称为x?您想调用xyz 与数组中的前六个元素def 的前六个元素称为x?还是您想要完全不同的东西?
  • 对不起,伙计们,赶时间。 def 是一个 Double(不是 [Double])。所以我需要用x.def的前6个元素调用一次func。 xyz(x[0...5].def) 不起作用。 array(x[0...5].def) 也是。谢谢

标签: arrays swift struct


【解决方案1】:

首先让我们使用更清晰的名称

struct Numbers {
    var values: [Double]
}

计算属性

现在我们可以添加一个计算属性来返回前 6 个值

struct Numbers {
    var values: [Double]

    var first6Numbers: [Double] {
        let numElms = min(values.count, 6)
        return Array(values[0..<numElms])
    }
}

如您所见,计算属性内的代码确实检查值中是否至少有 6 个元素。如果是,则返回前 6 个,否则返回尽可能多的元素。

示例

let fewNumbers = Numbers(values: [1,2,3])
fewNumbers.first6Numbers // [1,2,3]

let manyNumbers = Numbers(values: [1,2,3,4,5,6,7,8,9])
manyNumbers.first6Numbers // [1,2,3,4,5,6]

功能

我们可以使用函数来指定(通过参数)我们希望在结果中包含多少个数字,而不是总是返回前 6 个值

struct Numbers {
    var values: [Double]

    func firstNumbers(numElms: Int) -> [Double] {
        let numElms = min(values.count, numElms)
        return Array(values[0..<numElms])
    }
}

元组

我们还可以返回一个可选的 6 Double 元组。

在这种情况下,如果值中至少有 6 个值,则返回 6 个 Double 的双倍。否则返回 nil 值。

struct Numbers {
    var values: [Double]

    var first6Values: (Double, Double, Double, Double, Double, Double)? {
        guard values.count >= 6 else { return nil }
        return (values[0], values[1], values[2], values[3], values[4], values[5])
    }

}

示例

let numbers = Numbers(values: [1,2,3,4,5,6,7,8])

if let first6 = numbers.first6Values {
    print(first6.0)
    print(first6.1)
    print(first6.2)
    print(first6.3)
    print(first6.4)
    print(first6.5)
} else {
    print("Could not find at least 6 Doubles")
}

【讨论】:

    【解决方案2】:

    如果您想为前六个x 项目构建def 属性数组,您可以使用map

    let y = x[0...5].map { (object: abc) -> (Double) in
        return object.def 
    }
    xyz(y)
    

    或者您可以将其浓缩为:

    xyz(x[0...5].map { $0.def })
    

    【讨论】:

      【解决方案3】:

      只需像这样迭代序列:

      x[0...5].forEach { abc in
          xyz(abc.def)
      }
      

      for abc in x[0...5] {
          xyz(abc.def)
      }
      

      【讨论】:

        【解决方案4】:

        你可以像这样用相同的重复值初始化一个数组:

        var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
        

        这会给:

        [0.0, 0.0, 0.0]
        

        【讨论】:

          猜你喜欢
          • 2011-12-17
          • 2014-11-10
          • 1970-01-01
          • 2011-07-01
          • 2014-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-10
          相关资源
          最近更新 更多