Swift: How to declare a 2d array (grid or matrix) in Swift to allow random insert

前端 未结 1 634
猫巷女王i
猫巷女王i 2020-12-19 10:27

I need to be able to store information about cells in a 2d matrix or grid. Data is not contiguous so I may need to store data at 5,5 when there is no data at lower rows and

相关标签:
1条回答
  • 2020-12-19 10:51

    Here is a very basic implementation, using Dictionary as backend storage:

    struct Matrix2D<KeyElem:Hashable, Value> {
    
        var _storage:[KeyElem:[KeyElem:Value]] = [:]
    
        subscript(x:KeyElem, y:KeyElem) -> Value? {
            get {
                return _storage[x]?[y]
            }
            set(val) {
                if _storage[x] == nil {
                    _storage[x] = [:]
                }
                _storage[x]![y] = val
            }
        }
    }
    
    var matrix = Matrix2D<Int, String>()
    
    matrix[1,2] = "foo"
    

    as DictionaryLiteralConvertible:

    extension Matrix2D:DictionaryLiteralConvertible {
    
        typealias Key = (x:KeyElem, y:KeyElem)
    
        init(dictionaryLiteral elements: (Key, Value)...) {
            for (key, val) in elements {
                self[key.x, key.y] = val
            }
        }
    }
    
    var matrix:Matrix2D = [(1,2):"foo", (2,3):"bar"]
    

    Array backend version

    struct Matrix2D<T> {
    
        var _storage:[[T?]] = []
    
        subscript(x:Int, y:Int) -> T? {
           get {
                if _storage.count <= x {
                    return nil
                }
                if _storage[x].count <= y {
                    return nil
                }
                return _storage[x][y]
            }
            set(val) {
                if _storage.count <= x {
                    let cols = [[T?]](count: x - _storage.count + 1, repeatedValue: [])
                    _storage.extend(cols)
                }
                if _storage[x].count <= y {
                    let rows = [T?](count: y - _storage[x].count + 1, repeatedValue: nil)
                    _storage[x].extend(rows)
                }
                _storage[x][y] = val
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题