Есть ли лучший способ иметь массив Swift с именами, связанными с номерами индексов? - PullRequest
0 голосов
/ 24 мая 2019

В Swift я хочу иметь массив элементов, а затем иметь возможность доступа к этим элементам по имени или по индексу. Массив представляет собой массив фиксированного размера с 3 элементами.

У меня есть следующая реализация, использующая struct

struct Boxes {
    var array: [Int]!
    var a: Int {
        get { return array[0] }
        set { array[0] = newValue }
    }
    var b: Int {
        get { return array[1] }
        set { array[1] = newValue }
    }
    var c: Int {
        get { return array[2] }
        set { array[2] = newValue }
    }
    init() {
        self.array = Array<Int>(repeating: 0, count: 3)
    }
}

А затем используйте его следующим образом:

var box = Boxes()
box.a = 1
box.b = box.array[0]
box.array[0] = 2
box.b = box.a

Существует ли более простая, изящная / лаконичная форма для этого?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019
struct Boxes {

    var array: [Int] {
        get { return [a, b, c] }
        set { (a, b, c) = (newValue[0], newValue[1], newValue[2]) }
    }

    var (a, b, c) = (0, 0 ,0)
}

Обратите внимание, что оно основано на этом предложении: массив фиксированного размера с 3 элементами

Точно такое же использование:

var box = Boxes()
box.a = 1
box.b = box.array[0]
box.array[0] = 2
box.b = box.a

Дополнительно: Вы можете добавить пользовательский инициализатор, если хотите инициализировать с массивом:

init(array: [Int] = [0, 0, 0]) {
    self.array = array
}
1 голос
/ 24 мая 2019

Как насчет использования enum для хранения ассоциаций имя-индекс и добавления нижнего индекса к Boxes для доступа к массиву:

enum BoxName : Int {
    case a, b, c
}

struct Boxes {
    var array: [Int]!

    subscript(_ name: BoxName) -> Int {
        get { return array[name.rawValue] }
        set { array[name.rawValue] = newValue }
    }

    init() {
        self.array = Array<Int>(repeating: 0, count: 3)
    }
}

// usage:

var box = Boxes()
box[.a] = 1
box[.b] = box.array[0]
box.array[0] = 2
box[.b] = box[.a]

Теперь, когда вы хотите добавить новый элемент иновое имя в массиве, вам просто нужно добавить новый регистр enum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...