Swift 泛型无法按预期工作,来自 Objective-C 解析器的 JSON 字典



我有一个函数可以从JSON字典中检索非可选值。它需要 3 个参数:字典、键和默认值,用于字典中没有值或值类型错误

的情况
func valueFromJSONDict<T>(dict:[NSObject: AnyObject]?, key: NSObject, defaultValue: T) -> T {
    if let value = dict?[key] as? T {
        return value
    }
    return defaultValue
}

问题是它总是返回默认值。

title = valueFromJSONDict(dict, "title", "")

但是如果我在没有泛型的情况下做同样的事情,它可以正常工作:

title = { () -> String 
   if let value = dict?["title"] as? String {
      title = value
   } else {
      return ""
   }
}()

这个解析的JSON字典来自Objective-C解析器,如果我从字典中println dynamicType值就像__CFNSString,但T.selfSwift.String,所以Swift可能无法找出类型

我如何让它工作?

你的dict对象是什么样子的?

这是我的建议:

typealias JSONObject = [String: AnyObject]
func valueFromJSON<T>(json: JSONObject?, key: String, defaultValue: T) -> T
{
    if let value = json?[key] as? T {
        return value
    }
    return defaultValue
}
let json = ["Name": "Sir Lancelot",
            "Quest": "To seek the Holy Grail",
            "Favorite Color": "Blue..."]
let name = valueFromJSON(json, "Name", "Sir Not Appearing In This Film")

发现,该方法实际上有效,我将结果分配给某个变量或让

let value = valueFromJSONDict(dict, "title", "") // value from JSON

但如果我将结果分配给属性,则不起作用

title = valueFromJSONDict(dict, "title", "") // always ""

所以最后我通过将我的属性类型从非可选@NSManaged var title: String替换为隐式解包的可选@NSManaged var title: String!来解决此问题

最新更新