在swift2.0中使用反射,我尝试键入检查子值。
**问题:**任何项的镜像中children数组的每个元素都不是可选的,但它的类型可以是可选的......发生的情况是,即使值为nil,我当然也有child值
也许这是不清楚,所以我在这里放了一些代码来解释更好。
为了方便起见,我在镜像扩展中定义了一个下标,它获取具有给定标签的子对象
extension Mirror {
public subscript(key: String)->Child?{
var child = children.filter {
var valid = false
if let label = $0.label {
valid = label == key
}
return valid
}.last
if child == nil,
let superMirror = superclassMirror() {
child = superMirror[key]
}
return child
}
}
很好,现在假设我有这个类
class Rule: NSObject, AProtocol {
var hello: String?
var subRule: Rule?
}
好了,现在的问题
let aRule = Rule()
let mirroredRule = Mirror(reflecting:aRule)
if let child = mirroredRule["subRule"] {
//child.value always exists
//i can't do child.value is AProtocol? because child.value is not optional
//child.value is AProtocol of course returns false
//child.dynamicType is Optional(Rule)
if let unwrapped = unwrap(child.value) where unwrapped is AProtocol {
//This of course works only if child.value is not nil
//so the unwrap function returns an unwrapped value
//this is not a definitive solution
}
}
child.value还没有初始化,所以它是nil,我不能用unwrap函数检查它的类型。我正在写一个反序列化器,所以我需要检查var是否也是nil,因为在字典中,它将被用于反序列化,它可能被定义。
private func unwrap(subject: Any) -> Any? {
var value: Any?
let mirrored = Mirror(reflecting:subject)
if mirrored.displayStyle != .Optional {
value = subject
} else if let firstChild = mirrored.children.first {
value = firstChild.value
}
return value
}
我希望问题很清楚。有什么建议吗?
1条答案
按热度按时间dphi5xsq1#
基于this answer,我建议使用
if case Optional<Any>.some(_)
。我最近做了一些事情来确保我的结构体上至少有一个可选的集合。你可以粘贴到操场上: