检查变量是否被计算或存储
Check if variable is computed or stored
在我的应用程序中,我将自定义 classes 中的对象翻译成字典,以便它们可以保存在本地 plist 以及服务器上。我使用以下方法将 class 的属性转换为字典:
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
}
但是,我在计算属性方面遇到了问题。似乎那些是计算出来的,返回的值也被放入字典中,我想避免这种情况。所以这是我的问题:
是否可以检查 属性 是否仅使用其名称以编程方式计算?
我假设这可以通过尝试为其分配一个值来实现,这会给我一个错误或一些类似的方法。
您可以尝试 property_copyAttributeList(_:_:)
函数,它可能包含 swift 的计算属性的只读标记。虽然我猜想 let
属性也会有那个标记,所以你必须找到一种方法来区分它们。
根据 dasblinkenlight
的建议,这似乎是一个可行的解决方案。
不是使用上面概述的 Objective-C 方法,而是创建 class 的 Mirror
,它具有由所有可设置属性组成的 children
,因此不包括可计算属性.
这样使用:
let mirror = Mirror(reflecting: MyObject)
for case let (label?, value) in mirror.children {
print (label, value)
}
这里label是变量名,value显然是值
编辑: 如果有人想将对象转换成字典,我也会在这里发布完整的代码。但是请记住,如果值也是自定义对象,则它们也需要转换。
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
}
在我的应用程序中,我将自定义 classes 中的对象翻译成字典,以便它们可以保存在本地 plist 以及服务器上。我使用以下方法将 class 的属性转换为字典:
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
}
但是,我在计算属性方面遇到了问题。似乎那些是计算出来的,返回的值也被放入字典中,我想避免这种情况。所以这是我的问题:
是否可以检查 属性 是否仅使用其名称以编程方式计算?
我假设这可以通过尝试为其分配一个值来实现,这会给我一个错误或一些类似的方法。
您可以尝试 property_copyAttributeList(_:_:)
函数,它可能包含 swift 的计算属性的只读标记。虽然我猜想 let
属性也会有那个标记,所以你必须找到一种方法来区分它们。
根据 dasblinkenlight
的建议,这似乎是一个可行的解决方案。
不是使用上面概述的 Objective-C 方法,而是创建 class 的 Mirror
,它具有由所有可设置属性组成的 children
,因此不包括可计算属性.
这样使用:
let mirror = Mirror(reflecting: MyObject)
for case let (label?, value) in mirror.children {
print (label, value)
}
这里label是变量名,value显然是值
编辑: 如果有人想将对象转换成字典,我也会在这里发布完整的代码。但是请记住,如果值也是自定义对象,则它们也需要转换。
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
}