使用来自Objective-C解析器的JSON字典,Swift泛型无法正常工作

时间:2015-04-25 00:03:39

标签: objective-c json swift generics

我有一个从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 dict来自Objective-C解析器,如果来自dict的println dynamicType值与__CFNSString类似,但T.self是{{1}因此,Swift无法找出类型

如何让它发挥作用?

2 个答案:

答案 0 :(得分:0)

您的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")

答案 1 :(得分:0)

我发现,实际工作的方法是将结果分配给某些var或让

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

但如果我将结果分配给某个属性,则无效

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

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