2016-12-12 4 views
0

Ich möchte das Token vom Server nehmen und es dann der Token-Variable zuweisen, damit ich es als Header in meiner .post-Anfrage-Methode übergeben kann.Kann keinen Wert vom Typ "Any" zuweisen, um "String?" Swift 3 (iOS)

var token = ["X-Auth-Token": ""] 

zuordnen Prozess

token["X-Auth-Token"] = response.result.value! 

Nachdem Sie das getan erhalte ich die Fehler

kann nicht Wert vom Typ "Any" zuweisen Typ "String?"

Wie kann ich das umgehen oder beheben?

Voll Klasse:

import Alamofire 
import UIKit 

class InitialViewController: UIViewController { 
    let url = "https://api.sis.kemoke.net/auth/login" 
    var parameters = ["email": "", "password": ""] 
    var token = ["X-Auth-Token": ""] 

    // Parameters textfields 
    @IBOutlet weak var email: UITextField? 
    @IBOutlet weak var password: UITextField? 

    // A method for the login button 
    @IBAction func loginButton(_ sender: UIButton) { 
     parameters["email"] = email?.text 
     parameters["password"] = password?.text 
     Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: nil).responseJSON { 
      (response) in 
      print(response.result.value!) 
      token["X-Auth-Token"] = response.result.value! 
     } 
    } 
} 

Antwort

3

ich diesen Ansatz vorschlagen würde:

Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: nil).responseJSON { 
    (response) in 
    if let tokenString = response.result.value as? String { 
     token["X-Auth-Token"] = tokenString 
    } 
} 

von if let tokenString = response.result.value as? String verwenden Sie überprüfen, ob response.result.value ein String ist, bevor Sie versuchen, es zu String zu werfen.

versuchen immer zu vermeiden explictly eine optionale wie diese Unwraping:

token["X-Auth-Token"] = response.result.value as! String 

Wenn response.result.value ist, aus irgendeinem Grund, wäre kein String Ihre Anwendung zum Absturz bringen. Der Hauptzweck von Optionals ist es, Sie vor solchen Abstürzen zu schützen.

+1

FYI ist - die 'print' Anweisung zu einem Absturz führen wird. Bewege es in das "wenn du es lässt". – rmaddy

+0

Danke. Ich habe 'print' aus der Antwort entfernt, da dies für die Implementierung nicht sehr wichtig ist. – JPetric

-2

Cast String, wenn es sich um eine Zeichenfolge

@IBAction func loginButton(_ sender: UIButton) { 
    parameters["email"] = email?.text 
    parameters["password"] = password?.text 
    Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: nil).responseJSON { 
     (response) in 
     print(response.result.value?) 
     token["X-Auth-Token"] = response.result.value as? String 
    } 
+0

Tun Sie das nicht. Dies stürzt ab, wenn 'response.result.value'' nil' ist oder wenn es sich nicht wirklich um eine 'String' handelt. – rmaddy

+0

auch können wir "guard" oder "wenn" – nick

+0

verwenden Der lustige Teil ist, dass er das optionale in der 'print'-Anweisung auspackt, und dann den optionalen Typ verwendet, während der Wert zugewiesen wird ... das macht keinen Sinn Wenn es abstürzt, stürzt es in der print-Anweisung ab –

Verwandte Themen