我有一个带有 String 属性的对象。我必须使用键值编码从外部设置该属性。因此,我使用 self.setValue(value, forKeyPath: key)
。
这里的问题是,我可以将 NSNumber 设置为值,这会导致崩溃并显示消息 -[__NSCFNumber length]: 无法识别的选择器发送到实例
。如何在值和属性之间进行类型检查以避免崩溃?
value 将 NSObject 返回为动态类型。
obj.valueForKey(key).dynamicType
给我返回 AnyObject?
我尝试过并且可以做的是:
if (obj.valueForKey(key) is String && value is String) {...}
问题是我的对象显然有多个 String 属性,它有很多属性。我尝试做的是运行所有属性并将它们设置为来自 Web 服务的特定值。现在,我需要进行通用数据类型检查以查看是否存在类型不匹配,例如
if (obj.valueForKey(key).realtype == value.realtype) {...}
最佳答案
如果您知道 keyPath 接受字符串,则可以使用 Swift as?
运算符来确保您分配的值可以转换为它。
像这样的东西:
self.setValue(value as? String ?? "Bad value", forKeyPath: key)
通过这样做,您可以确保传递正确的属性值(转换后),或者传递默认值,以防情况不成功。
关于Swift KVC 将 NSNumber 值设置为 String 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35792617/