【问题标题】:valueForKey throws error for optional value, SwiftvalueForKey 为可选值抛出错误,Swift
【发布时间】:2014-08-26 10:41:36
【问题描述】:

我有简单的课程User。当我尝试调用 valueForKey 其中 key 是可选值时,我得到一个错误。见下文:

class User : NSObject{
    var name = "Greg"
    var isActive:Bool?        
}

var user = User()
user.isActive = true // initiated

var ageValue : AnyObject! = user.valueForKey("name")// OK

var isActive : AnyObject! = user.valueForKey("isActive") //ERROR

<__lldb_expr_862.user> valueForUndefinedKey:]:这个类对于键 isActive 不符合键值编码。

如果我启动该值,它将起作用:

var isActive:Bool =  true

如何使它与可选值一起工作?

【问题讨论】:

  • @Zaph 我构建了 JSON 转换器,我需要通过将键提供为字符串来获取价值
  • 一些swift类型不能在Obj-C中表示,因此不能参与KVO。 Optional Bool 就是这样一种类型。如果您将关键字 dynamic 放在 var isActive:Bool? 之前,您会看到编译器抱怨它...
  • 目前在这种情况下,可选整数类型(Bool?)和Objective-C NSNumbers之间没有自动映射,所以isActive不能用valueForKey获取可选整数类型和 NSNumber 之间的正常自动映射工作。
  • 您可以按照 osanoj 的建议执行诸如覆盖 valueForKeyvalueForUndefinedKey 之类的操作,但即使有可能,也很难将其用于通用案例。
  • @David 感谢您的澄清。希望在下一个测试版中...... :)

标签: swift key-value


【解决方案1】:

我不确定你为什么要这样做,如果你真的必须使用键值编码,是为了兼容 obj-c 吗?

这也可能是稍后更新 Swift 时修复的问题。但是现在(临时)解决方法可能是覆盖 valueForKey 函数并特别注意您的选项。像这样的:

override func valueForKey(key: String!) -> AnyObject! {
    if key == "isActive" {
        if self.isActive == nil {
            return NSNumber(bool: false)
        }
        else {
            return NSNumber(bool: self.isActive!)
        }
    }
    return super.valueForKey(key)
}

请记住,我自己基本上从不使用键值编码,所以我不知道重写该函数是否是一个坏主意......同样在 obj-c 中 BOOL 不是可空的,所以我假设你想要在那种情况下是假的? (对于 Bool 类型,我宁愿跳过我认为的可选)

【讨论】:

  • 我构建了 JSON 转换器,我需要通过提供字符串形式的键来获取值
  • 这个答案对我没有帮助,因为我写的是通用形式,键会不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
相关资源
最近更新 更多