迭代结构的静态属性

时间:2016-09-06 00:58:28

标签: ios swift loops struct

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

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

let treeParts = [String]()
// insert code here to make treeParts = ["Bark", "Roots"]

2 个答案:

答案 0 :(得分:0)

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

allProperties()功能的代码来自How to loop over struct properties in 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]
}

由于Struct现在是一个单例,它的所有属性只会被初始化一次,并且线程的安全性由它的静态实例变量给出。

答案 1 :(得分:0)

我也在寻找这个,最终使用了一个枚举。如果您只有一个静态值列表(这很好,但是枚举也有一些限制,例如没有扩展名...):

enum Tree: String, CaseIterable {
    case bark = "Bark"
    case roots = "Roots"
}

let allTrees = Tree.allCases.map{ $0.rawValue }
print(allTrees) // => ["Bark", "Roots"]