【问题标题】:Iterate over static properties of a struct迭代结构的静态属性
【发布时间】:2017-01-13 08:03:03
【问题描述】:

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

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

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

【问题讨论】:

  • 我没试过,但是你是在镜像结构的 instance 还是元类型?我认为要获得静态属性,您必须镜像Tree.type
  • 不确定 .type 是什么意思,我的结构没有该属性,但我用 .self 尝试过,但什么也没得到。
  • 对不起,对,应该说Tree.self(我在想大写-T“类型,但那是类型名,而不是元类型对象)。太糟糕了,不起作用。

标签: ios swift loops struct


【解决方案1】:

因为我也对如何做到这一点感兴趣,所以我做了下面的例子。为什么不直接创建具有非静态属性的结构以及使结构成为单例的静态实例变量。以下代码示例详细介绍了使用 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 现在是一个单例,它的所有属性将只初始化一次,并且线程安全性由它的静态实例变量给出。

【讨论】:

    【解决方案2】:

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

    enum Tree: String, CaseIterable {
        case bark = "Bark"
        case roots = "Roots"
    }
    
    let allTrees = Tree.allCases.map{ $0.rawValue }
    print(allTrees) // => ["Bark", "Roots"]
    

    【讨论】:

    • 使用enum的问题是不能扩展。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2015-09-20
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多