是否可以在 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
}
}
所以现在我们可以用这个方法遍历任何 class
或struct
的属性。我们只需要将该类标记为 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/