首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3反射-迭代属性

Swift 3反射-迭代属性
EN

Stack Overflow用户
提问于 2017-09-08 01:32:32
回答 1查看 455关注 0票数 2

尝试编写一个方便的toString()方法,该方法列出对象的所有属性及其赋值。

代码语言:javascript
复制
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 = ""
}

输出:

代码语言:javascript
复制
[FooProject Optional("id"): 0, Optional("name"): , Optional("announcement"): nil, Optional("showAnnouncement"): false, Optional("isCompleted"): false, Optional("completedOn"): nil, Optional("suiteMode"): 0, Optional("url"): , ]

首先,它不列出实际值,而是列出默认值。为什么会这样呢?第二,有办法摆脱Optional封装吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-08 01:59:14

根据关于Child 这里的文档:

儿童

反射实例结构的一个元素。可选标签可在适当时使用,例如表示存储的属性或活动枚举的名称,并将用于在String传递给子代方法时进行查找。

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

代码语言:javascript
复制
typealias Child = (label: String?, value: Any)

因此,所有的名字都被打印为选项。

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

我在操场上做了一些改动,并尝试过:

代码语言:javascript
复制
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())

最重要的是:

代码语言:javascript
复制
[FooProject id: 10, name: Name, announcement: nil, showAnnouncement: false, isCompleted: false, completedOn: Sunday, suiteMode: 0, url: , ]

高..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46107334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档