【问题标题】:Extract Value from Locksmith with SwiftyJson使用 SwiftyJson 从锁匠那里提取价值
【发布时间】:2015-02-25 02:24:10
【问题描述】:

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

知道为什么吗?

【问题讨论】:

    标签: ios json xcode swift


    【解决方案1】:

    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...
    }
    

    顺便说一句,如果你想使用 SwiftyJSON,你应该从 dictionary 创建 JSON 对象。

    if let dict = dictionary {
        var json = JSON(dict)
        var access_token = json["access_token"].stringValue
    }
    

    【讨论】:

    • 现在当我尝试将该值插入参数时,我收到以下错误:'String?'与“AnyObject”不同
    • "access_token" = 123123123123123 看起来它被存储为 [String:AnyObject] 但它实际上是一个 Int 否则它会有 "" 围绕它
    • @LeonardoSavioDabus NSDictionary 字符串表示不是这样:试试println(["access_token":"123"] as NSDictionary)
    • 所以如果它只返回 [String:String] 则不需要强制转换
    • @Alex 你只需要解开两个可选项,你可能需要一个条件转换。
    【解决方案2】:

    如您的“NSDictionary?”中所述字典是可选的。在从中提取 stringValue 之前,您必须解开您的可选项。你可以使用 if let 安全地打开它:

    编辑

    从 Rintaro 那里得到一个提示,正如 LockSmith 所提到的那样,它返回一个可选的字典,所以你需要先解开你的字典,然后你可以解开 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)
    
    }
    

    【讨论】:

    • 你的 NSDictionary 类型是什么?
    • 抱歉,您可能需要将其转换为 Int
    • 正如 Rintaro LockSmith 所提到的,它返回一个可选的字典,所以你需要先解开你的字典,然后你可以解开 access_toke 键值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多