我目前正在尝试使用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
}
}
}
现在的问题是,是否有可能检查是否可以通过
为相应变量安全地设置newValueself.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可能仍可转换为所需类型。