快速反射类型检查

时间:2015-09-16 11:35:27

标签: swift reflection types dynamictype

我目前正在尝试使用Swift反射和下标。在我的课上,我有以下函数来检查给定的键/变量是否存在:

func getMirror(key: String) -> MirrorType? {
    let mirror = reflect(self)
    for i in 0..<mirror.count {
        let (name,type) = mirror[i]
        if name == key { return type }
    }
    return nil 
}

然后,在下标声明中,我执行以下操作:

subscript(key: String) -> AnyObject? {
   ...
   set(newValue) {
        if let mirror : MirrorType = getMirror(key) {
            var type : Any.Type = mirror.valueType
            // Check here whether newValue is castable as type
        }
   }
}

现在的问题是,是否有可能检查是否可以通过

为相应变量安全地设置newValue
self.setValue(newValue, forKey: key)

如果值不可设置则返回异常。如果有一个Swift.Int或Swift.Double变量

println(type)

toString(type)

给出了这些类型的名称。但有没有办法探测newValue对这些类型的转换?我无法直接比较字符串,因为

newValue.dynamicType
如果解包,

返回Swift.Optional或__NSCFNumber。我已尝试使用NSClassFromString,但它似乎不适用于Swift本机类型。有没有办法做到这一点?

谢谢!

编辑:

另外一件事:我还尝试了以下

if let convertedValue: AnyObject = mirror.value as? AnyObject {
    var type = convertedValue.dynamicType
}

然后我可以使用

newValue!.isKindOfClass(type)

但是,如果我在类中有一个尚未实例化的可选项,那么这不起作用,因为mirror.value为nil。此外,newValue可能仍可转换为所需类型。

0 个答案:

没有答案