是否有可能迭代
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 _ { }