【发布时间】:2016-03-04 09:40:48
【问题描述】:
我有一个带有 String 属性的对象。我必须使用键值编码从外部设置该属性。因此,我使用的是self.setValue(value, forKeyPath: key)。
这里的问题是我可以将 NSNumber 设置为值,这会导致崩溃并显示消息 -[__NSCFNumber length]: unrecognized selector sent to instance。如何在值和属性之间进行类型检查以避免崩溃?
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) {...}
【问题讨论】:
-
为什么需要使用
setValue:forKeyPath:而不是直接设置值? -
能看到你的课就好了……
-
因为这是解析器的一部分,它从 objc 库中检索数据并在几个 swift 对象中设置值。我只有对象的父类而不是实际类。我不想将它转换为实际的类,因为有很多,我需要一个巨大的 if/switch 语句来遍历它们。
-
这就是你使用协议的那种事情。使您的对象符合声明您要设置的属性的协议。这样你就不需要每个对象的实际类型,只需要它的协议。