Swift KVC 将 NSNumber 值设置为 String 键

标签 swift kvc

我有一个带有 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/

相关文章:

ios - 为什么我在使用 Realm 时通过 KVC 获得值(value),而不是通过使用属性获得值(value)?

ios - 在 swift : How to populate the next available Table View cell with the contents of a Text Field?

java - 如何反序列化来自 RESTful Web 服务的 JSON 响应?

ios - 使用xib文件的自定义表格 View 的单元格,无法单击/选择/点击

swift - 我似乎无法让外键在 SQLite.swift 中工作

Objective-C 和键值编码 : How to avoid an exception with valueForKeyPath:?

ios - KVC - 带点分隔的键值编码 - 不符合 KVC 的异常(exception)

ios - 首选属性访问器或 KVC 样式来访问核心数据属性

ios - 如何在 Swift 中为 Int 数组(自定义字符串结构)实现 Hashable 协议(protocol)

html - 更改Swift NSAttributedString的无序列表的字体