【发布时间】:2015-12-30 16:49:47
【问题描述】:
我正在研究一组表示实体及其属性的类,然后可以从实体动态创建编辑器表视图。这些属性使用泛型来捕获属性类型。为了使用 KVO 并生成自动设置器,这些属性包含一个关键路径。这是属性类的一个非常简化的版本:
class XUEntityProperty<Entity: NSManagedObject, Value> {
let keyPath: String
var customSetter: ((Entity, Value) -> Void)?
func setValue(value: Value, onEntity entity: Entity) {
/// If custom setter is set, use it.
if let setter = self.customSetter {
setter(entity, value)
return
}
/// Otherwise set the object using the keypath.
guard let objValue = value as? AnyObject else {
XUThrowAbstractException() // Use custom setter
}
entity.setValue(objValue, forKeyPath: self.keyPath)
}
}
这几乎适用于任何东西。问题在于选项。例如:
let property = XUEntityProperty<MyEntity, NSDate?>(keyPath: "optionalDate")
这里的问题是,在setValue 方法中,转换为AnyObject 将失败,因为值为Optional<NSDate>,不能转换为AnyObject - 即使objValue as? NSDate 将返回nil objValue 是 .Some(_)。
我正在寻找一种解决方案,如何通过检测和解开 Optional 在自动设置器中解决此问题。
我尝试的任何转换都会导致编译器抱怨转换为更可选的类型,或者最终将Optional 包裹在另一个Optional 中。
有谁知道如何检测Any的值 是Optional,如果是,提取值从可选的,将其转换为 AnyObject?
给你一个在操场上尝试的例子:
let any: Any = Optional<String>("123")
any.dynamicType // -> Optional<String>.Type
var object: AnyObject? = nil
/// ... -> put value from `any` to `object`.
【问题讨论】: