2016-12-12 90 views
0

我想從服務器獲取令牌,然後將其分配給令牌變量,以便我可以將其作爲頭部傳遞給我的.post請求方法。無法指定「任何」類型的值來鍵入「字符串?」 Swift 3(iOS)

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

分配過程

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

這樣做後,我得到了錯誤

不能指定類型的值 「任意」 到類型 「串?」

如何繞過或修復此問題?

滿級:

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

回答

3

我建議這種做法:

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

使用if let tokenString = response.result.value as? String你會檢查是否response.result.value是試圖將其轉換爲字符串之前的字符串。

總是試圖避免顯式地unwraping可選這樣的:

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

如果response.result.value是,由於某種原因,而不是一個字符串您的應用程序會崩潰。 可選項的主要目的是保護你免受這樣的崩潰。

+1

僅供參考 - 在'print'語句將導致崩潰。把它移到'if let'裏面。 – rmaddy

+0

謝謝。我從答案中刪除了'print',因爲它對於實現並不重要。 – JPetric

-2

演員字符串,如果它是一個字符串

@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

不要這樣做。如果'response.result.value'爲'nil'或者它不是一個真正的'String',這將會崩潰。 – rmaddy

+0

我們還可以使用「guard」或「if let」 – nick

+0

有趣的部分是,他正在打開'print'語句中的可選項,然後在賦值時使用可選類型......這沒有意義,如果它崩潰,它會在打印語句中崩潰 –

相關問題