我有一个从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无法找出类型
如何让它发挥作用?
答案 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!
来修复此问题