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)
通过这样做,您可以确保为 属性 传递正确的值(在转换之后),或者在情况不成功的情况下传递默认值。
我有一个带有字符串 属性 的对象。我必须使用键值编码从外部设置 属性 。因此,我使用 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)
通过这样做,您可以确保为 属性 传递正确的值(在转换之后),或者在情况不成功的情况下传递默认值。