【问题标题】:Problems with generic Arrays in Swift [duplicate]Swift 中泛型数组的问题 [重复]
【发布时间】:2015-06-29 13:32:03
【问题描述】:

由于我对 iOS 中的原生编程非常陌生,因此在以下情况下我需要一些帮助。我需要的是一个类,它包含一个数组或字典,其中包含 2 个整数的组合作为键(用于网格矩阵中的坐标)和一个整数作为值。我在某处的教程中找到了一个解决方案,如下所示:

class Array2D<T> {
    let columns: Int
    let rows: Int

    var array: Array<T?>

    init(columns: Int, rows: Int) {
        self.columns = columns
        self.rows = rows

        array = Array<T?>(count: rows * columns, repeatedValue: nil)
    }

    subscript(column: Int, row: Int) ->T! {
        get {
            return array[(row * columns) + column]
        }
        set(newValue) {
            array[(row * columns) + column] = newValue
        }
    }
}

不幸的是,这种类型的数组已经有行*列的长度,一旦类被初始化,这是我不想要的。数组一开始应该是空的。但是,如果我初始化一个空数组,那么在获取或设置一个尚不存在的键的值时会遇到问题。此外,我需要能够轻松地增加特定键的值(如array[2, 3]++)。有人对我的问题有好的解决方案吗?

【问题讨论】:

  • 您能更好地阐明您想要实现的目标吗?你有固定数量的行/列吗? “一开始是空的”是什么意思?如果之前从未设置过该值,array[2, 3] 应该返回什么?
  • 谢谢@ABakerSmith,这正是我想要的!
  • 抱歉@Martin R 不够清楚... :(

标签: swift swift-playground swift2


【解决方案1】:

只需将它与可选项一起使用,因此没有设置初始值。在这个例子中,你有你的columns 和你的rows,它们是可选的,并用nil 初始化。数组初始化为空数组。

class Array2D<T> {
    let columns: Int? = nil
    let rows: Int? = nil

    var array: Array<T?> = []
}

【讨论】:

  • 谢谢,但这并不能解决下标 getter 和 setter 的问题,当它尝试获取或设置不存在的键的值时会引发错误(即。@ 987654325@)
【解决方案2】:

为什么不为类似坐标创建struct

struct Coordinate {
    let column: Int
    let row: Int
}

...然后为EquatableHashable 协议提供必要的实现,然后将其用作字典中的键,例如:

struct Array2D<T> {
    private var storage = [Coordinate: T]()
    // ...
}

...然后为该 Array2D 提供subscript,当分配一个值时,它会简单地将新条目插入到水下字典中,当读取该值时,只需从那里读取它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多