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

时间:2016-04-01 01:22:12

标签: swift swifty-json

我想知道为什么SwiftyJSON有时会将值返回为“myString”,而其他时间则返回可选(“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 将返回:可选(“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)
        }

    }

此处令牌将返回“myString”

那么当两个函数都使用“。string”而不是“时,一个函数如何返回optional()。string!”

3 个答案:

答案 0 :(得分:4)

SwiftyJSON有两种" getters"用于检索值:可选和非可选。

.string是值的字符串表示的可选 getter,因此您必须在使用前将其解包

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

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

如果您<100>确定总会有值,则可以使用等效的&#34;强制解包&#34;通过使用非可选的getter,您不再需要if let

let fbId = fbJson["id"].stringValue

但要注意,因为如果值为nil,这将会崩溃,就像你用fbJson["id"].string!强行解包一样(你永远不应该这样做)。

请注意,SwiftyJSON对其他类型的工作原理相同:.int vs .intValue.array vs .arrayValue等。

答案 1 :(得分:3)

!是危险的,特别是当你不知道它是否是可选的时。只需这样:

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

答案 2 :(得分:-1)

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