【问题标题】:Create Two dimensional Array of Arrays with two variable types in Swift在 Swift 中创建具有两种变量类型的二维数组
【发布时间】:2019-07-25 16:31:25
【问题描述】:

您可以使用以下方法快速创建一种类型变量的二维数组:

var array2D: [[String]] = [["hi", "bye"], ["hello", "goodbye"]]

我想创建一个二维数组,其中第二个变量为浮点数,如下所示:

var array2d2types = [[String,Float]] = [["height",1],["width",2]]

但这会产生错误:Cannot assign to immutable expression of type '[[Any]]'

如何创建一个数组,每个数组都有一个字符串和一个浮点数?

【问题讨论】:

  • 改用元组(或自定义结构)。
  • Leo,我尝试从 Any 向下转换为 Float,但遇到了问题。
  • 不要这样做我建议你使用 CGSize 对象数组let sizes: [CGSize] = [.init(width: 2, height: 1)]
  • Using width and height may have been misleading These could be any string 以及为什么不从一般意义上考虑它们,您将如何处理应用流程中的键名????

标签: arrays swift multidimensional-array


【解决方案1】:

Swift 数组是同构的,所以你不能在同一个数组中存储不同类型的元素。但是,您可以使用元组数组而不是嵌套数组来实现您的目标。

let array: [(String,Float)] = [("height",1),("width",2)]

您可以使用正常的下标语法访问元组

let firstTuple = array[0]

以及使用点语法的元组元素

let height = firstTuple.0
let heightValue = firstTuple.1

但是,您应该使用自定义结构甚至更好的内置 CGSize 来存储高度-宽度值。

【讨论】:

  • 如何访问这些?我会使用数组 [0] 访问一个元组吗?我可以访问高度/宽度作为 let mystring = array[0][0] 和 1/2 作为 let myfloat = array[0][1]
  • let mystring = array[0].0let myfloat = array[0].1
  • 太棒了!谢谢
【解决方案2】:

如果你想存储各种类型,你应该使用自定义的struct。这还有一个额外的好处是允许您使用有意义的名称而不是索引来访问这些值:

struct Record {
    var string: String
    var float: Float

    // Structs give you an init for free, but require you to list the names.
    // For conciseness I created this func to make it closer to your example
    static func i(_ string: String, _ float: Float) -> Record {
        return Record(string: string, float: float)
    }
}

var records: [Record] = [.i("height",  1), .i("width", 2)]

print(records[0].string)  // "height"
print(records[0].float)   // 1.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多