当前位置: 首页 > 面试题库 >

如何在Swift中遍历struct属性?

公西飞鸾
2023-03-14
问题内容

是否可以在Swift中遍历结构的属性?

我需要在使用许多不同单元格类型的视图控制器中注册单元格重用标识符(单元格组织在不同的nib文件中)。所以我的想法是将所有重用标识符和对应的nib文件作为静态元组属性(reuseID,nibName)放入结构中。但是,如何遍历所有这些元素以将单元格注册到tableView?

我已经尝试过一些东西(请参阅下面的答案)。但是有没有更简单的方法来做到这一点,例如,无需将每个属性都放在数组中?


问题答案:

尽管是老问题,但随着Swift的发展,这个问题有了新的答案。我认为您的方法更适合描述的情况,但是最初的问题是如何遍历struct属性,所以这是我的答案(
适用于类和struct

您可以使用“
镜像结构参考”
。关键是,在调用reflect某个对象之后,您会得到它的“镜像”,这虽然很少,但是仍然很有用。

因此,我们可以轻松声明以下协议,其中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
    }
}

因此,现在我们可以遍历 任何 方法的属性classstruct使用此方法。我们只需要将班级标记为即可PropertyLoopable

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

struct ReuseID: PropertyLoopable {
    static let instance: ReuseID = ReuseID()
}

无论是否使用单例,我们最终都可以遍历如下属性:

do {
    print(try ReuseID.instance.allProperties())
} catch _ {

}

循环结构属性就是这样。享受迅速;)



 类似资料:
  • 我有对象 和多阵列 例如,我如何通过数组迭代得到一个名字为" Masha "的人 预先感谢

  • 本文向大家介绍Swift遍历,包括了Swift遍历的使用技巧和注意事项,需要的朋友参考一下 例子            

  • 问题内容: 我对Xcode在《 Swift编程语言指南》中给我进行此实验的答案感到有些困惑: 我知道随着字典的使用,最大的数字被设置为变量。但是,我对为什么Xcode会说要根据每次测试设置5次,1次或3次感到困惑。 查看代码时,我发现应该单独在“ Prime”中将其设置6次(2、3、5、7、11、13)。然后,它应该跳过“斐波那契”中的任何数字,因为这些数字都小于最大数字,该数字当前已从“ Pri

  • 我有一个简单的枚举,我想迭代一下。为此,我采用了顺序和迭代器协议,如下面的代码所示。顺便说一句,这可以复制/粘贴到Xcode 8中的游乐场。 但是for in循环生成错误消息“Type”节。Type不符合协议“Sequence”。协议一致性在我的扩展中;那么,这个代码有什么问题? 我知道还有其他方法可以做到这一点,但我想知道这种方法有什么问题。 谢谢

  • 问题内容: 我在寻找一个struct的字符串字段遍历,所以我可以做一些清理/验证(与,等)。 现在,我有一个混乱的开关盒,它并没有真正的可扩展性,而且由于这并不是我的应用程序(Web表单)的热点,因此在这里利用杠杆作用似乎是一个不错的选择。 我对于如何实现此功能有点障碍,反射文档对我来说有点困惑(我一直在研究其他一些验证包,但是它们太笨重了,我正在使用大猩猩/模式已用于解组部分): 遍历该结构 对

  • 问题内容: 我正在尝试在Swift操场上编写一段非常简单的代码。 但是,我总是在第3行出现错误。 “字符串”没有名为“生成器”的成员 有什么想法为什么不起作用?注意:我正在使用Swift 2.0(字符串和字符)在Xcode 7中工作。 问题答案: 从Swift 2开始,不符合。但是,您可以在使用属性。返回符合的,因此可以通过循环进行迭代: 另外,您可以添加扩展名使其符合: 虽然,我确定Apple有