我在Swift中尝试访问令牌的价值。我正在使用Locksmith加载令牌,如下所示:
let (dictionary, error) = Locksmith.loadDataForUserAccount("userAccount")
这将在控制台中返回以下内容:
Optional({
"access_token" = 123123123123123;
})
我正在使用SwiftyJSON来提取访问令牌的值
var access_token = dictionary["access_token"].stringValue
我收到以下错误:
'NSDictionary?' does not have a member named 'subscript'
知道为什么吗?
答案 0 :(得分:2)
LockSmith返回(NSDictionary?, NSError?)
:
public class func loadDataForUserAccount(userAccount: String, inService service: String = LocksmithDefaultService) -> (NSDictionary?, NSError?)
因此,在您的情况下,dictionary
本身就是Optional
:
尝试:
var access_token = dictionary?["access_token"] as? String
此处access_token
为String?
,可以是nil
。如果要将其存储到AnyObject
变量,则必须将其解包。例如,使用"Optional Binding":
if let token = access_token {
// Here, `token` is `String`, while `access_token` is `String?`
self.access_token = token
}
或更直接:
if let access_token = dictionary?["access_token"] as? String {
// Here, access_token is `String`, not `String?`
self.access_token = token
}
else {
// error handling...
}
BTW,如果你想使用SwiftyJSON,你应该从JSON
创建dictionary
对象。
if let dict = dictionary {
var json = JSON(dict)
var access_token = json["access_token"].stringValue
}
答案 1 :(得分:0)
正如您在'NSDictionary'中所描述的那样?字典是可选的。您必须在从中提取stringValue之前解包您的可选项。如果让:
,你可以放心地打开它修改强>
从他提到的Rintaro中提取一个提示LockSmith返回一个可选的Dictionary,所以你需要首先解开你的字典,然后你可以解开access_token键值
if let dictionary = dictionary {
if let access_token = dictionary["access_token"] as? Int { // or as? String
println(access_token)
} else {
println(false)
}
} else {
println(false)
}
或者如果它返回一个[String:String]字典,则不需要将值强制转换为String
if let dictionary = dictionary {
if let access_token = dictionary["access_token"] {
println(access_token)
} else {
println(false)
}
} else {
println(false)
}