【问题标题】:Swift Generic 2d ArraySwift 通用二维数组
【发布时间】:2016-02-17 01:09:16
【问题描述】:

我想做一些相对简单的事情。我想要一个泛型类型的二维数组。据我了解,我应该在基本类型周围使用两组方括号,并且可以使用简化的循环表达式来初始化值。 我有以下代码,但我收到一个错误,cannot be constructed because it has no accessible initializes。下面是我正在使用的代码。提前感谢您的帮助。

array = [[Element]](count: 3, repeatedValue: Element(count: 2, repeatedValue: nil))

编辑: 我想提供我正在使用的代码的完整源代码

struct Array2D<Element> {
    let columns: Int
    let rows: Int
    private var array: Array<Element?>

    init(columns: Int, rows: Int) {
        self.columns = columns
        self.rows = rows
        array = [[Element]](count: 3, repeatedValue: Element(count: 2, repeatedValue: nil))
    }

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

【问题讨论】:

    标签: ios arrays swift generics multidimensional-array


    【解决方案1】:

    private var array: Array<Element?>
    

    Array2D 中的属性是正常的(“一维”) 用于存储rows * columns 元素的数组。它必须初始化为:

    array = [Element?](count: rows * columns, repeatedValue: nil)
    

    或者只是(因为类型是已知的):

    array = Array(count: rows * columns, repeatedValue: nil)
    

    【讨论】:

      【解决方案2】:

      Swift 不知道 Element 有一个 Element 类型的初始化器。

      以下是使用帮助程序类的方法:

      class TwoDArray<T> {
          static func create(initialValue: T, rows: Int, cols: Int) -> [[T]] {
              let tmp = [T](count: cols, repeatedValue: initialValue)
              return [[T]](count: rows, repeatedValue: tmp)
          }
      }
      
      let result = TwoDArray.create(42, rows: 3, cols: 2)
      

      如果你想用nil 初始化数组,你必须提供一个可选类型:

      let result = TwoDArray<Int?>.create(nil, rows: 3, cols: 2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        相关资源
        最近更新 更多