在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
是否有一种更简单,更优雅/简洁的形式来做到这一点?
答案 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]
现在,当您想在数组中添加新元素和新名称时,只需添加一个新的枚举大小写即可。