检查是否计算或存储变量

时间:2017-06-29 11:25:00

标签: swift computed-properties

在我的应用程序中,我将自定义类中的对象转换为字典,以便它们可以本地保存在plist和服务器上。我使用以下内容将类的属性转换为字典:

func dictionary() -> [String : Any] {

    var count: UInt32 = 0;
    let myClass: AnyClass = self.classForCoder;
    let properties = class_copyPropertyList(myClass, &count);

    var dictionaryRepresentation: [String:Any] = [:]

    for i in 0..<count {
        let property = properties![Int(i)]
        let cStringKey = property_getName(property);
        let key = String(cString: cStringKey!)

        dictionaryRepresentation[key] = self.value(forKey: key) as Any
    }

    return dictionaryRepresentation
}

但是,我遇到了计算属性的问题。似乎这些都是计算出来的,并且返回的值也被放入字典中,我想避免。所以这是我的问题:

是否可以检查是否仅使用其名称以编程方式计算属性?

我假设这可能是通过尝试为其分配一个值,这会给我一个错误或类似的方法。

2 个答案:

答案 0 :(得分:1)

根据dasblinkenlight的建议,这似乎是一个有效的解决方案。

不是使用上面概述的Objective-C方法,而是创建一个Mirror类,其中children由所有可设置属性组成,因此不包括可计算项。

像这样使用:

let mirror = Mirror(reflecting: MyObject)

for case let (label?, value) in mirror.children {
    print (label, value)
}

这里label是变量的名称,值显然是值。

编辑:如果有人想将对象转换为字典,我也会在这里发布完整的代码。但请记住,如果值也是自定义对象,那么也需要转换它们。

func dictionary() -> [String:Any] {
    let mirror = Mirror(reflecting: self)

    var dictionaryRepresentation = [String:Any]()

    for case let (label, value) in mirror.children {

        guard let key = label else { continue }

        dictionaryRepresentation[key] = value
    }

    return dictionaryRepresentation
}

答案 1 :(得分:0)

您可以尝试使用property_copyAttributeList(_:_:)函数,它可能包含swift计算属性的只读标记。虽然我猜let属性也会有这个标记,所以你必须找到一种方法来区分它们。