迭代结构的静态属性

mat*_*bor 6 struct loops ios swift

是否有一种简单的方法来迭代结构的所有属性?我熟悉的非静态属性的方法是使用Mirror,但是当struct只包含静态属性时,这会返回一个空数组.这是我想要实现的一个例子:

struct Tree {
    static let bark = "Bark"
    static let roots = "Roots"
}

let treeParts = [String]()
// insert code here to make treeParts = ["Bark", "Roots"]
Run Code Online (Sandbox Code Playgroud)

bla*_*acx 1

因为我也对如何做到这一点感兴趣,所以我做了下面的例子。为什么不直接创建具有非静态属性和静态实例变量的结构,这使得该结构成为单例。以下代码示例详细介绍了Person使用 REST API 的命名语义将对象的值映射到 JSON 字典的示例用例。的属性名称PersonJSONKeys必须与 的属性名称匹配Person

allProperties()函数的代码来自如何在 Swift 中循环遍历结构属性?。您可以轻松修改此函数以仅返回结构属性的值。

struct PersonJSONKeys: PropertyLoopable {
    static let instance: PersonJSONKeys = PersonJSONKeys()
    private init() {}

    let name = "name"
    let firstName = "first_name"
    let age = "age"
}

struct Person: PropertyLoopable {
    let name = "Doe"
    let firstName = "John"
    let age = "18"
}

let person = Person()
let personProperties = person.allProperties()
var personJSON: [String:Any] = [:]

for jsonProperty in PersonJSONKeys.instance.allProperties() {
    let propertyName = jsonProperty.key
    let jsonKey = jsonProperty.value as! String
    personJSON[jsonKey] = personProperties[propertyName]
}
Run Code Online (Sandbox Code Playgroud)

由于 Struct 现在是单例,因此它的所有属性将仅初始化一次,并且线程安全性由其静态实例变量给出。