Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 迭代结构的静态属性_Ios_Swift_Loops_Struct - Fatal编程技术网

Ios 迭代结构的静态属性

Ios 迭代结构的静态属性,ios,swift,loops,struct,Ios,Swift,Loops,Struct,有没有一种简单的方法可以迭代结构的所有属性?我熟悉的非静态属性的方法是使用,但是当结构只包含静态属性时,这将返回一个空数组。以下是我努力实现的一个例子: struct Tree { static let bark = "Bark" static let roots = "Roots" } let treeParts = [String]() // insert code here to make treeParts = ["Bark", "Roots"] 因为我也对如何做到这

有没有一种简单的方法可以迭代结构的所有属性?我熟悉的非静态属性的方法是使用,但是当结构只包含静态属性时,这将返回一个空数组。以下是我努力实现的一个例子:

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

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

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

allProperties()
函数的代码来自。您可以轻松地修改此函数,以仅返回结构属性的值

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]
}

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

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


我还没有尝试过这个,但您是在镜像结构或元类型的实例吗?我认为要获得静态属性,您必须镜像
Tree.type
。不确定您所说的.type是什么意思,我的结构没有该属性,但我尝试了.self,但没有得到任何结果。对不起,对了,应该说
Tree.self
(我想的是大写字母-t”类型,但那是类型名,不是元类型对象)。太糟糕了,这不起作用。使用
enum
的问题是无法扩展它。
enum Tree: String, CaseIterable {
    case bark = "Bark"
    case roots = "Roots"
}

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