值有时会作为可选字符串返回 SwiftyJSON

Posted

技术标签:

【中文标题】值有时会作为可选字符串返回 SwiftyJSON【英文标题】:Value sometimes returns as optional string with SwiftyJSON 【发布时间】:2016-04-01 01:22:11 【问题描述】:

我想知道为什么 SwiftyJSON 有时会返回 "myString" 的值,而有时会返回 Optional("myString")

例如:

func getFBUserData()
        if((FBSDKAccessToken.currentAccessToken()) != nil)
            FBSDKGraphRequest(graphpath: "me", parameters: ["fields": "id, email"]).startWithCompletionHandler( (connection, result, error) -> Void in
                if (error == nil)

                    let fbJson = JSON(result)
                    let fbId = fbJson["id"].string
                    print(fbId)
                
            )
        
    

这里 fbId 将返回:Optional("myString")

下一步:

static func loginWithEmail(facebookId: String, email: String, username: String, response: (token: String?) -> ()) 
        let urlString = baseURL + ResourcePath.FbLogin.description

        let parameters: [String: AnyObject] = [
            "fb_id": facebookId,
            "level": 1,
            "email": email,
            "username": username
        ]
        Alamofire.request(.POST, urlString, parameters: parameters).responseJSON (responseData) -> Void in
            //print(responseData)
            let json = JSON(responseData.result.value!)
            let token = json["api_token"].string
            response(token: token)
        

    

这里 token 将返回 "myString"

那么当两个函数都使用 ".string" 而不是 ".string!" 时,一个函数如何返回 optional() 呢?

【问题讨论】:

在第二种情况下,您如何打印token 【参考方案1】:

SwiftyJSON 有两种用于检索值的“getter”:可选的和非可选的。

.string 是一个值的字符串表示的可选 getter,所以你必须在使用前打开它

if let fbId = fbJson["id"].string 
    print(fbId)

否则字符串本身将包含术语“可选”。

如果您100% 确定总会有一个值,则可以通过使用非可选 getter 来使用等效于“强制展开”的方法,并且不需要 if let不再:

let fbId = fbJson["id"].stringValue

但要小心,因为如果值为 nil,这将崩溃,就像您使用 fbJson["id"].string! 强制解包一样(您不应该这样做)。

请注意,SwiftyJSON 对其他类型的工作方式相同:.int vs .intValue.array vs .arrayValue

【讨论】:

【参考方案2】:

! 很危险,尤其是当您不知道它是否是可选的时。请这样做:

func getFBUserData()
        if((FBSDKAccessToken.currentAccessToken()) != nil)
            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, email"]).startWithCompletionHandler( (connection, result, error) -> Void in
                if (error == nil)

                    let fbJson = JSON(result)
                    if let fbId = fbJson["id"].string 
                        print(fbId)
                    
                
            )
        
    

【讨论】:

【参考方案3】:

那是因为你这样做让 fbJson = JSON(result) 而不是 let fbJson = JSON(result!)

【讨论】:

以上是关于值有时会作为可选字符串返回 SwiftyJSON的主要内容,如果未能解决你的问题,请参考以下文章

选项的保护语句在 swift 中为零

如何在 Swiftyjson 中检查值是日期字符串还是双精度值?

在 SwiftyJSON 中处理可选元素的最佳方法是啥?

尝试读取我的数据库用户详细信息,它会作为可选值打印出来

使用 Alamofire 和 SwiftyJson 从函数返回值

条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]