使用SwiftyJson从Locksmith中提取值

时间:2015-02-25 02:24:11

标签: ios json xcode swift

我在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'

知道为什么吗?

2 个答案:

答案 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_tokenString?,可以是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)

}