是否有可能迭代
Swift中的结构的属性?
我需要在视图控制器中注册单元重用标识符,该标识符使用许多不同的单元格类型(单元格组织在不同的nib文件中).所以我的想法是将所有重用标识符和相应的nib文件作为静态元组属性(reuseID,nibName)放在一个结构体中.但是,如何迭代所有这些注册表单与tableView?
解决方法
虽然老问题,斯威夫特演变这个问题有新的答案.我认为你的方法对于描述的情况来说更好,然而原始的问题是如何迭代结构属性,所以这里是我的答案(适用于类和结构体)
您可以使用Mirror Structure Reference.关键是,在调用反映到某个对象后,您会得到它的“镜像”,这是非常谨慎但仍然有用的反思.
所以我们可以轻松地声明以下协议,其中key是属性的名称,value是实际值:
- protocol PropertyLoopable
- {
- func allProperties() throws -> [String: Any]
- }
当然,我们应该利用新的协议扩展来为此协议提供默认的实现:
- 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
- }
- }
所以现在我们可以用这个方法循环任何类或结构的属性.我们只需要将该类标记为PropertyLoopable.
为了保持静态(如示例),我还将添加一个单例:
- struct ReuseID: PropertyLoopable {
- static let instance: ReuseID = ReuseID()
- }
无论是否使用单例,我们最终可以循环使用如下所示的属性:
- do {
- print(try ReuseID.instance.allProperties())
- } catch _ {
- }