Swift 3反射 - 迭代属性

时间:2017-09-08 01:32:32

标签: swift reflection swift3

尝试编写一个方便的root@SKYPHY:/usr/lib/python2.7/site-packages# python Python 2.7.12 (default, Sep 7 2017, 15:21:53) [GCC 4.8.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named dbus 方法,列出对象的所有属性及其赋值。

toString()

输出:

class FooModel
{
    func toString() -> String
    {
        var result = "[\(String(describing: type(of: self))) "
        let mirror = Mirror(reflecting: self)
        mirror.children.forEach
        {
            child in
                result += "\(child.label): \(child.value), "
        }
        return "\(result)]"
    }
}

class FooProject : FooModel
{
    var id = 0
    var name = ""
    var announcement:String?
    var showAnnouncement = false
    var isCompleted = false
    var completedOn:String?
    var suiteMode = 0
    var url = ""
}

首先,它不会列出实际值,而是列出默认值。这是为什么? 第二,有没有办法摆脱[FooProject Optional("id"): 0, Optional("name"): , Optional("announcement"): nil, Optional("showAnnouncement"): false, Optional("isCompleted"): false, Optional("completedOn"): nil, Optional("suiteMode"): 0, Optional("url"): , ] 封装?

1 个答案:

答案 0 :(得分:1)

根据Child here的文档:

儿童

  

反射实例结构的元素。适当时可以使用任选的标签,例如,代表一个名字   存储属性或活动枚举大小写,将用于查找   当字符串传递给后代方法时。

因为镜像中的类型子项被定义为

typealias Child = (label: String?, value: Any)

因此,所有名称都打印为选项。

要获取标签名称,您可以使用可选绑定

我做了一些改变并在游乐场尝试了这个:

class FooModel
{
        func toString() -> String
        {
                var result = "[\(String(describing: type(of: self))) "
                let mirror = Mirror(reflecting: self)
                mirror.children.forEach
                        {
                                child in
                                print(child)
                                if let label = child.label {

                                                result += "\(label): \(child.value), "


                                }

                }
                return "\(result)]"
        }
}

class FooProject : FooModel
{
        var id = 0
        var name = ""
        var announcement:String!
        var showAnnouncement = false
        var isCompleted = false
        var completedOn:String!
        var suiteMode = 0
        var url = ""

        init(id: Int, name: String, completedOn: String) {
                self.completedOn = completedOn
                self.id = id
                self.name = name
                //...

        }
}

    let fooProj = FooProject(id: 10, name: "Name", completedOn: "Sunday")
    print(fooProj.toString())

Ouptut是:

[FooProject id: 10, name: Name, announcement: nil, showAnnouncement: false, isCompleted: false, completedOn: Sunday, suiteMode: 0, url: , ]

HTH ..