【问题标题】:Can not assign a value of type "Any" to type "String?" Swift 3 (iOS)无法将“Any”类型的值分配给“String”类型?斯威夫特 3 (iOS)
【发布时间】:2016-12-15 18:15:07
【问题描述】:

我想从服务器获取令牌,然后将其分配给令牌变量,这样我就可以在我的 .post 请求方法中将它作为标头传递。

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

分配过程

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

执行此操作后我得到错误

无法将“Any”类型的值分配给“String”类型的值?

如何绕过或修复此问题?

全班:

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    我会建议这种方法:

    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 是否为字符串。

    始终尝试避免像这样显式地解开可选项

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

    如果 response.result.value 出于某种原因不是字符串,您的应用就会崩溃。 选项的主要目的是保护您免受此类崩溃的影响。

    【讨论】:

    • 仅供参考 - print 语句将导致崩溃。将其移到if let 内。
    • 谢谢。我从答案中删除了print,因为它对实施并不那么重要。
    【解决方案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
        }
    

    【讨论】:

    • 不要这样做。如果 response.result.valuenil 或者它不是真正的 String,这将崩溃。
    • 我们也可以使用“guard”或“if let”
    • 有趣的是,他在 print 语句中解开可选类型,然后在赋值时使用可选类型......这没有意义,如果它崩溃,它会在打印语句中崩溃
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    相关资源
    最近更新 更多