我有一个函数可以从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.self
是Swift.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!
来解决此问题