【问题标题】:Swift KVC setting a NSNumber value to String keySwift KVC 将 NSNumber 值设置为 String 键
【发布时间】: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 语句来遍历它们。
  • 这就是你使用协议的那种事情。使您的对象符合声明您要设置的属性的协议。这样你就不需要每个对象的实际类型,只需要它的协议。

标签: swift kvc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多