Как увидеть значения в структуре?

subscript
ios
swift3

#1

Подскажите, новичку, есть такая структура:

struct Matrix {
    let rows: Int, columns: Int
    
    var grid: [Double]
    
    init(rows: Int, columns: Int) {
        
        self.rows = rows
        
        self.columns = columns
        
        grid = Array(repeating: 0.0, count: rows * columns)
    }
    
    func indexIsValid(row: Int, column: Int) -> Bool {
        
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    
    subscript(row: Int, column: Int) -> Double {
        
        get {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "Index out of range")
        }
    }
}

С помощью инициализатора задаем количество строк и столбцов и создаем массив для значений, который первоначально инициализируем нулями.

Далее создаем экземпляр типа и задаем конкретное количество строк и столбцов:

var matrix = Matrix(rows: 2, columns: 2)

Затем с помощью сабскриптов задаем значения для массива с указанием ячеек сетки по индексам строк и столбцов

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

Т.е. здесь в нулевую строку и первый по индексу столбец задается значение 1.5, а в первую по индексу строку и нулевой столбец задается значение 3.2

Но как увидеть эти значения?

Увидеть количество строк и столбцов по идее понятно:

matrix.rows
matrix.columns

Но если попытаться посмотреть массив

matrix.grid

то выдает нули, как и при первоначальной инициализации.

Так а как же тогда увидеть эти значения, которые присвоены с помощью сабскриптов?


#2
set {
  assert(indexIsValid(row: row, column: column), "Index out of range")
  grid[(row * columns) + column] = newValue
}

Так должен сеттер выглядеть


#3

он почти так и выглядит

    subscript(row: Int, column: Int) -> Double {
        
        get {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "Index out of range")
        }

Сам пример взят из учебника


#4

Если он будет выглядеть так, как я написал, то будет работать так, как вы хотите и в вашем примере

matrix.grid

будет возвращать [0, 1.5, 3.2, 0]


#5

Да, работает, сэнкс.

Получается, что авторы учебника в этом примере ошиблись?


#6

Я зашел сейчас в учебник и там в примере все верно написано. Может в вашем учебнике опечатка.


#7

блин, сорри, это моя оплошность.

Спасибо за подсказку!