值有时 returns 作为带有 SwiftyJSON 的可选字符串

Value sometimes returns as optional string with SwiftyJSON

我想知道为什么 SwiftyJSON 有时 return 的值是 "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 将 return: 可选("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将return"myString"

那么当两个函数都使用 ".string" 而不是 ".string!"[= 时,一个函数 return optional() 怎么可能呢? 33=]?

那是因为你在做这个 let fbJson = JSON(result) 而不是 让 fbJson = JSON(结果!)

! 很危险,尤其是当您不知道它是否 optional.Just 时,请这样做:

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

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

.stringoptional getter 表示一个值的字符串,所以你必须在使用前解包

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

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

如果您 100% 确定 总会有一个值,您可以通过使用非可选 getter 你不再需要 if let:

let fbId = fbJson["id"].stringValue

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

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