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

标签 ios uitableview swift ios8 tuples

是否可以在 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/

相关文章:

ios - 如何使用 uiwebview 和 swift 登录网站?

ios - iOS 中的异步多个 URL Puller

ios - 使用 Swift 的 TableViewCell 监听器

swift - 如何从 Stripe 中获取描述错误?

ios - Swift:如何以编程方式推进容器 View 内的 UIPageViewController?

ios - 哪里解释了 iOS 应用程序的架构?

ios - UITableView:在初始滚动时使用自定义/可变单元格高度滚动到底部不准确

ios - 重用后如何使自定义 UITableViewCell 顶部单元格唯一绘制?

ios - UITableView 头部 View 动画

ios - .enforceQoS 标志如何提高优先级?