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

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

}

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

猜你在找的iOS相关文章