Swift 3反射 - 迭代属性



尝试编写便利性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"): , ]

首先,它没有列出实际值,而是默认值。这是为什么?其次,有没有办法摆脱Optional封装?

根据有关Child的文档:

儿童

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

因为镜子中的类型儿童被定义为

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 ..

最新更新