我正在使用Swift中的Mirror
,我发现Mirror.Child
非常奇怪,标签是可空的,但值似乎不可空。
public typealias Child = (label: String?, value: Any)
我不知道如何检查该值是否为空。
let b: Bool? = true
let a: Any = b
print(a == nil) // false
我有一个解决方案:
print(String(describing: a) == "nil") // true
但这显然不是一个好的解决方案。
检查 a
是否为 nil
的最佳方法是什么?
让我提供更多细节:
let mirror = Mirror(reflecting: object) // object can be any object.
for child in mirror.children {
guard let label = child.label else {
continue
}
// how to check if the value is nil or not here ?
setValue(child.value, forKey: label)
}
Mirror
是您想要的工具的情况。如果您试图创建反射系统,您会发现Mirror
无法解决这个问题。目前在Swift中无法建立反射系统(这就是为什么Codable
必须具有特殊的编译器支持;不能在Swift中编写它)。 - Rob NapiersetValue(_:forKey:)
也感到困惑。这是 ObjC 运行时的一部分,除非你有自己的版本。Mirror
和 ObjC 运行时并不特别兼容。如果你只想反射 NSObject 的子类,那么 ObjC 运行时有广泛的支持。 - Rob Napierclass_getProperty
、class_getInstanceMethod
等方法。 - Rob NapierNSManagedObject
,那就比那更容易了。看一下NSManagedObjectModel
和特别是NSEntityDescription
。Core Data会告诉你关于托管对象的大部分信息。 - Rob NapiersetValue(child.value, forKey: label)
是用于NSManagedObject
的,而Mirror(reflecting: object)
中的object
则是一个 Swift 对象。 - JIE WANG