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

前端之家收集整理的这篇文章主要介绍了ios – 如何循环Swift中的结构属性?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有可能迭代 Swift中的结构的属性

我需要在视图控制器中注册单元重用标识符,该标识符使用许多不同的单元格类型(单元格组织在不同的nib文件中).所以我的想法是将所有重用标识符和相应的nib文件作为静态元组属性(reuseID,nibName)放在一个结构体中.但是,如何迭代所有这些注册表单与tableView?

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

解决方法

虽然老问题,斯威夫特演变这个问题有新的答案.我认为你的方法对于描述的情况来说更好,然而原始的问题是如何迭代结构属性,所以这里是我的答案(适用于类和结构体)

您可以使用Mirror Structure Reference.关键是,在调用反映到某个对象后,您会得到它的“镜像”,这是非常谨慎但仍然有用的反思.

所以我们可以轻松地声明以下协议,其中key是属性名称,value是实际值:

  1. protocol PropertyLoopable
  2. {
  3. func allProperties() throws -> [String: Any]
  4. }

当然,我们应该利用新的协议扩展来为此协议提供默认的实现:

  1. extension PropertyLoopable
  2. {
  3. func allProperties() throws -> [String: Any] {
  4.  
  5. var result: [String: Any] = [:]
  6.  
  7. let mirror = Mirror(reflecting: self)
  8.  
  9. guard let style = mirror.displayStyle where style == .Struct || style == .Class else {
  10. //throw some error
  11. throw NSError(domain: "hris.to",code: 777,userInfo: nil)
  12. }
  13.  
  14. for (labelMaybe,valueMaybe) in mirror.children {
  15. guard let label = labelMaybe else {
  16. continue
  17. }
  18.  
  19. result[label] = valueMaybe
  20. }
  21.  
  22. return result
  23. }
  24. }

所以现在我们可以用这个方法循环任何类或结构的属性.我们只需要将该类标记为PropertyLoopable.

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

  1. struct ReuseID: PropertyLoopable {
  2. static let instance: ReuseID = ReuseID()
  3. }

无论是否使用单例,我们最终可以循环使用如下所示的属性

  1. do {
  2. print(try ReuseID.instance.allProperties())
  3. } catch _ {
  4.  
  5. }

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

猜你在找的iOS相关文章