Swift KVC 将 NSNumber 值设置为字符串键

Swift KVC setting a NSNumber value to String key

我有一个带有字符串 属性 的对象。我必须使用键值编码从外部设置 属性 。因此,我使用 self.setValue(value, forKeyPath: key).

这里的问题是我可以将 NSNumber 设置为值,这会导致崩溃并显示消息 -[__NSCFNumber length]: unrecognized selector sent to instance。如何在值和 属性 之间进行类型检查以避免崩溃?

value 将 NSObject 返回为 dynamicType。 obj.valueForKey(key).dynamicType 还给我 AnyObject?

我尝试过并且可以做的是:

if (obj.valueForKey(key) is String && value is String) {...}

问题是我的对象显然有不止一个字符串属性,它有很多属性。我尝试做的是 运行 通过所有属性并将它们设置为来自 Web 服务的特定值。现在,我需要一个通用数据类型检查,看看是否存在类型不匹配,比如

if (obj.valueForKey(key).realtype == value.realtype) {...}

如果您知道您的 keyPath 接受字符串,您可以使用 Swift as? 运算符来确保您分配的值可以转换为它。 类似于:

self.setValue(value as? String ?? "Bad value", forKeyPath: key)

通过这样做,您可以确保为 属性 传递正确的值(在转换之后),或者在情况不成功的情况下传递默认值。