2016-04-01 6 views
1

Ich frage mich, warum die SwiftyJSON manchmal einen Wert als "myString" liefert und ein andermal als Optional ("myString")Wert manchmal kehrt als optionale Zeichenkette mit SwiftyJSON

Zum Beispiel:

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

Hier FBID zurückkehren: Optional ("myString")

Next:

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

    } 

Hier Token kehrt "myString"

Wie also kann eine Funktion Rückkehr optional(), wenn beide Funktionen verwenden "System.String" und nicht “.String ! "?

+0

Wie drucken Sie die 'token' im zweiten Fall? – Sulthan

Antwort

2

SwiftyJSON hat zwei Arten von „Getter“ zum Abrufen von Werten: Optional und nicht optional.

.string ist die optional Getter für die String-Darstellung eines Wertes, so müssen Sie es vor

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

sonst der String selbst den Begriff „Optional“ enthalten Gebrauch auszupacken.

Wenn Sie 100% sicher, dass es immer einen Wert sein wird, können Sie das Äquivalent von „Kraft unwrap“ verwenden, indem die Nicht-Optional Getter verwenden und Sie brauchen nicht mehr if let:

let fbId = fbJson["id"].stringValue 

Aber Vorsicht, weil dies zum Absturz führen wird, wenn der Wert Null ist, genau so, als ob Sie mit fbJson["id"].string! zwangsentpacken wären (was Sie nie tun sollten).

Beachten Sie, dass SwiftyJSON das gleiche gilt für die anderen Arten funktioniert: .int vs .intValue, .array vs .arrayValue usw.

-1

Das liegt daran, dass Sie dies tun, lassen fbJson = JSON (Ergebnis) statt lassen fbJson = JSON (Ergebnis!)

3

! gefährlich ist vor allem, wenn Sie nicht wissen, ob es optional.Just wie folgt tun:

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