2017-03-10 5 views
0

Ich arbeite an einer App, die einen Login-Bildschirm, der eine Premiere für mich ist. Nachdem ich verschiedenen Webseiten gefolgt war, die Tutorials für dieses Thema zur Verfügung stellten, machte ich einen LoginService ViewController, der bei der Anmeldung in der App helfen würde.Xcode - Swift 2.0: "Extra Argument" Fehler 'in Anruf "mit NSJSONSerialization

Hier ist ein Teil des Codes, die ich in diesem Viewcontroller verwendet haben:

// MARK: Private Methods 

private func exchangeTokenForUserAccessTokenWithCompletionHandler(username: String, password: String, completion: (OAuthInfo?, error: String?) ->()) { 

    let path = "/oauthfake/token/" 
    let url = ConnectionSettings.apiURLWithPathComponents(path) 
    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 

    var params = "client_id=\(ConnectionSettings.clientId)&client_secret=\(ConnectionSettings.clientSecret)&grant_type=password&login=\(username)&password=\(password)" 

    var err: NSError? 
    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 


    let task = session.dataTaskWithRequest(request) {data, response, error -> Void in 

     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary 

     if (err != nil) { 

      // Something went wrong, log the error to the console. 
      print(err!.localizedDescription) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Something went wrong: '\(jsonStr)") 

      completion(nil, error: err?.localizedDescription) 
     } else { 
      if let parseJSON = json { 
       if let token = parseJSON.valueForKey("access_token") as? String { 
        if var issuedAt = parseJSON.valueForKey("issued_at") as? String { 
         if var tokenExpiresIn = parseJSON.valueForKey("expires_in") as? String { 
          if var refreshTokenIssuedAt = parseJSON.valueForKey("refresh_token_issued_at") as? String { 
           if let refreshToken = parseJSON.valueForKey("refresh_token") as? String { 
            if var refreshTokenExpiresIn = parseJSON.valueForKey("refresh_token_expires_in") as? String { 
             if let refreshCount = parseJSON.valueForKey("refresh_count") as? String { 

              let epochIssuedAt:Double = (issuedAt as NSString).doubleValue/1000.0 
              let epochRefreshTokenIssuedAt:Double = (refreshTokenIssuedAt as NSString).doubleValue/1000.0 

              let oauthInfo = OAuthInfo(issuedAt: epochIssuedAt, refreshTokenIssuedAt: epochRefreshTokenIssuedAt, tokenExpiresIn: (tokenExpiresIn as NSString).doubleValue, refreshToken: refreshToken, token: token, refreshTokenExpiresIn: (refreshTokenExpiresIn as NSString).doubleValue, refreshCount: (refreshCount as NSString).integerValue) 

              completion(oauthInfo, error: err?.localizedDescription) 

Mein super.init scheint in fein (nicht oben gekennzeichnet), sowie den Rest des Codes zu arbeiten, diese Datei, aber ich bekomme einen Fehler beim Lesen der „extra-Argument‚Fehler‘in Call“ auf dieser Linie:

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary 

ich habe gesammelt schon, dass Swift 2.0 Fehler anders zu dem, was Greift ich gewohnt bin. Ich weiß, dass diese Version von Swift für Fehler Fehlercodes verwendet. Mein Problem ist, dass ich keine dieser Codearten zuvor verwendet habe und mir nicht sicher bin, wie ich sie in dieser speziellen Situation einsetzen soll.

Antwort

0

Die JSONObjectWithData Funktion erfordert die dotrycatch Syntax, die Sie erwähnten, weil das Verfahren in seiner Erklärung Website mit dem throws Schlüsselwort gekennzeichnet ist. (Dokumentation hier: https://developer.apple.com/reference/foundation/jsonserialization/1418059-jsonobject)

Nein, es einfach zu verwenden. https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42-ID508

0

auf iOS 7 und letztere NSJSONSerialization ist Thread safe.Now Sie es mit do try catch

Swift 3 verwenden können:

do { 
try someMethodWhichCanThrow() 
catch(error) { 
// maybe log the error here 
} 

Dies wird hier in der Swift Programmiersprache Buch beschrieben

Swift 2:

do{ 
    let jsonDict = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as! [String:AnyObject] 
}catch let error as NSError{ 
    print(error) 
} 
+0

Danke für das Feedback, zu sehen, wie Sie die Syntax ausgelegt haben, war sehr hilfreich! Wenn es in Ordnung ist zu fragen (ich lerne immer noch darüber, tut mir leid), wollte ich sicherstellen, dass ich genau weiß, wo genau ich den Do Try Catch-Code im Vergleich zu der Zeile mit dem NSJSONSerialization-Fehler setzen sollte. –

+0

@ R.Osolinski: Möchten Sie zwei NSJSONSerialization vergleichen? – Donal

Verwandte Themen