gpt4 book ai didi

ios - 如何循环 Swift 中的结构属性?

转载 作者:IT王子 更新时间:2023-10-29 05:09:19 28 4
gpt4 key购买 nike

是否可以在 Swift 中迭代结构的属性?

我需要在使用许多不同单元格类型(单元格组织在不同的 nib 文件中)的 View Controller 中注册单元格重用标识符。所以我的想法是将所有重用标识符和相应的 nib 文件作为静态元组属性(reuseID,nibName)放在一个结构中。但是我如何遍历所有这些以将单元格注册到 tableView?

我已经尝试过一些东西(见下面我的回答)。但是有没有更简单的方法来做到这一点,例如没有将每个属性都放在数组中?

最佳答案

虽然是老问题,但随着 Swift 的发展,这个问题有了新的答案。我认为您的方法对于所描述的情况更好,但是最初的问题是如何迭代结构属性,所以这是我的答案(适用于类和结构)

您可以使用 Mirror Structure Reference 。重点是,在对某个对象调用 reflect 之后,您会得到它的“镜像”,这种反射非常少,但仍然很有用。

因此我们可以轻松声明以下协议(protocol),其中 key 是属性的名称,value 是实际值:

protocol PropertyLoopable
{
func allProperties() throws -> [String: Any]
}

当然我们应该使用新的协议(protocol)扩展来为这个协议(protocol)提供默认实现:

extension PropertyLoopable
{
func allProperties() throws -> [String: Any] {

var result: [String: Any] = [:]

let mirror = Mirror(reflecting: self)

guard let style = mirror.displayStyle where style == .Struct || style == .Class else {
//throw some error
throw NSError(domain: "hris.to", code: 777, userInfo: nil)
}

for (labelMaybe, valueMaybe) in mirror.children {
guard let label = labelMaybe else {
continue
}

result[label] = valueMaybe
}

return result
}
}

所以现在我们可以用这个方法遍历任何 classstruct 的属性。我们只需要将该类标记为 PropertyLoopable

为了保持静态(如示例中所示),我还将添加一个单例:

struct ReuseID: PropertyLoopable {
static let instance: ReuseID = ReuseID()
}

无论是否使用单例,我们最终都可以像下面这样遍历属性:

do {
print(try ReuseID.instance.allProperties())
} catch _ {

}

这就是循环结构属性。享受快速 ;)

关于ios - 如何循环 Swift 中的结构属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27292255/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com