【问题标题】:What does "Expression implicitly coerced" warning mean?“表达式隐含强制”警告是什么意思?
【发布时间】:2018-03-22 17:26:33
【问题描述】:
func downloadCurrentWeather(completed: @escaping DownloadComplete){
    Alamofire.request(API_URL).responseJSON { (response) in
        let result = response.result

        let json = JSON(result.value) // <-- (EXPRESSION IMPLICITLY COERCED WARNING)
        self._cityName = json["name"].stringValue
        let tempDate = json["dt"].double
        let convertedDate = Date(timeIntervalSince1970: tempDate!)
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium
        dateFormatter.timeStyle = .none
        let currentDate = dateFormatter.string(from: convertedDate)
        self._date = "\(currentDate)"
        self._weatherType = json["weather"][0]["main"].stringValue
        let downloadedTemp = json["main"]["temp"].double
        self._currentTemp = (downloadedTemp! - 273.15).rounded(toPlaces: 0)
        completed()
    }
}

【问题讨论】:

标签: ios swift swift4.1


【解决方案1】:

这是强制的,因为 valueAny? 可选值。我建议打开 value 以确保它不是 nil

func downloadCurrentWeather(completed: @escaping DownloadComplete){
    Alamofire.request(API_URL).responseJSON { (response) in
        guard let value = response.result.value else {
            print(response.result.error ?? "Unknown error")
            return
        }

        let json = JSON(value)

        ...
    }
}

作为进一步的改进,我将更改 DownloadComplete 以包含有关它是否失败的信息。例如,我可能会添加一个Error? 参数,然后你可以这样做:

func downloadCurrentWeather(completed: @escaping DownloadComplete){
    Alamofire.request(API_URL).responseJSON { (response) in
        guard let value = response.result.value else {
            completed(response.result.error)
            return
        }

        let json = JSON(value)

        ...

        completed(nil)
    }
}

然后调用者可以查看error 是否为nil


另一种方法是在response.result 上使用switch,因为在.success 的情况下,您可以只使用关联的值:

func downloadCurrentWeather(completed: @escaping DownloadComplete){
    Alamofire.request(API_URL).responseJSON { response in
        switch response.result {
        case .failure(let error):
            completed(error)
        case .success(let value):
            let json = JSON(value)
            ...
            completed(nil)
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-10-13
    • 2015-06-21
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多