有没有更好的方法来使Swift数组的名称与索引号相关联?

时间:2019-05-24 20:05:36

标签: swift

在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 个答案:

答案 0 :(得分:3)

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 :(得分:2)

如何使用枚举存储名称到索引的关联,并将下标添加到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]

现在,当您想在数组中添加新元素和新名称时,只需添加一个新的枚举大小写即可。