簡體   English   中英

調用中缺少參數“委托”的參數 // JSON 文件在 SWIFT 中損壞?

[英]Missing argument for parameter 'delegate' in call // JSON file corrupted in SWIFT?

我正在學習 SWIFT // XCODE 11.4 的電子課程教程,我必須從 Open Weather API 獲取數據並將其顯示在人們可以輸入城市的界面上,視圖 controller 將顯示溫度、雲圖標和描述.

Clima 應用教程

我正在使用 MVC 模式設計和委托設計來完成本教程。 我的swift文件如下:

Swift MVC 設計模式中的文件

以下是每個重要文件中的代碼:

一、Model文件夾

WeatherManager.swift

protocol WeatherManagerDelegate {
    func didUpdateWeather(weather: WeatherModel)
}

struct WeatherManager {
    let weatherURL = "https://api.openweathermap.org/d.5/weather?appid=c8b50079338280b47a65dd6082551e3b&units=imperial"

    let delegate: WeatherManagerDelegate?



    func fetchWeather(cityName: String) {
        let urlString = "\(weatherURL)&q=\(cityName)"
        performRequest(urlString: urlString)
    }

    func performRequest(urlString: String) {

        //create a URL
        if let url = URL(string: urlString) {

            //create a URLSession
            let session = URLSession(configuration: .default)

            //give session a task
            let task = session.dataTask(with: url) { (data, response, error) in
                if error != nil {
                    print(error!)
                    return //exit out of the func if there is an error
                }

                if let safeData = data {

                    if let weather =  self.parseJSON(weatherData: safeData) {
                    self.delegate?.didUpdateWeather(weather: weather)
                    }
                }
            }
            //start the tast
            task.resume()
        }
    }

    func parseJSON (weatherData: Data) -> WeatherModel? {
        let decoder = JSONDecoder()
        do {
            let decodedData = try decoder.decode(WeatherData.self, from: weatherData)
            let id = decodedData.weather[0].id
            let temp = decodedData.main.temp
            let name = decodedData.name


            let weather = WeatherModel(conditionId: id, cityName: name, temperature: temp)
            return weather

        } catch {
            print(error)
            return nil
        }
    }

}

WeatherData.swift

struct WeatherData: Codable {
    let name: String
    let main: Main
    let weather: [Weather]
}

struct Main: Codable {
    let temp: Double
}

struct Weather: Codable {
    let id: Int
}

WeatherModel.swift

struct WeatherModel {
    let conditionId: Int
    let cityName: String
    let temperature: Double

    var temperatureString: String {
        return String(format: "%.1f", temperature)
    }

    var conditionName: String {
        switch conditionId {
        case 200...232:
            return "cloud.bolt"
        case 300...321:
            return "cloud.drizzle"
        case 500...531:
            return "cloud.rain"
        case 600...622:
            return "cloud.snow"
        case 701...781:
            return "cloud.fog"
        case 800:
            return "sun.max"
        case 801...804:
            return "cloud.bolt"
        default:
            return "cloud"
        }
    }

}

二。 Controller

WeatherViewController.swift(報錯的地方)

class WeatherViewController: UIViewController, UITextFieldDelegate, WeatherManagerDelegate {

    @IBOutlet weak var conditionImageView: UIImageView!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var searchTextField: UITextField!

    var weatherManager = WeatherManager()

    override func viewDidLoad() {

        super.viewDidLoad()
        weatherManager.delegate = self

        searchTextField.delegate = self
    }

    @IBAction func searchPressed(_ sender: UIButton) {
        searchTextField.endEditing(true)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        searchTextField.endEditing(true)
        print(searchTextField.text!)
        return true
    }

    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        if textField.text != "" {
            return true
        } else {
            textField.placeholder = "Type something..."
            return false
        }
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        if let city = searchTextField.text {
            weatherManager.fetchWeather(cityname: city)
        }

        searchTextField.text = ""

    }

    func didUpdateWeather(weather: WeatherModel) {
        print(weather.temperature)
    }


}

以下是錯誤消息:Missing argument for parameter 'delegate' in call Error message in WeatherViewControl.swift

當我點擊運行按鈕時,我在調試控制台中也遇到了這個錯誤:

dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: “給定的數據無效 JSON。”, underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 “字符 0 周圍的值無效。”UserInfo={NSDebugDescription=字符 0 周圍的值無效。})))

調試控制台錯誤

我應該怎么做才能擺脫這些錯誤?

let delegate: WeatherManagerDelegate? struct WeatherManager中。

調用中缺少參數“委托”的參數

創建struct時,需要為每個屬性創建一個值。

如果每個屬性都指定了默認值並且沒有用戶定義的初始化程序,那么 Swift 將為struct創建一個默認初始化程序

如果至少有一個屬性沒有默認值並且沒有用戶定義的初始化程序,那么 Swift 將創建一個成員初始化程序,該初始化程序為每個沒有默認值的屬性都有一個參數。

例如你的類型:

struct WeatherModel {
   let conditionId: Int
   let cityName: String
   let temperature: Double
...

具有三個沒有默認值的屬性。 如果您開始輸入:

let myWeatherModel = WeatherModel(

然后完成您將獲得的完成(類似於):

let wm = WeatherModel(conditionId: <Int>, cityName: <String>, temperature: <Double>)

完成顯示了成員初始化器

您產生錯誤的類型是:

struct WeatherManager {
   let weatherURL = "https://api.openweathermap.org/d.5/weather?appid=c8b50079338280b47a65dd6082551e3b&units=imperial"
   let delegate: WeatherManagerDelegate?

它有兩個屬性,其中只有一個具有默認值,並且沒有初始化器,因此 Swift 將自動創建一個成員明智的初始化器。

到目前為止沒有任何問題。

產生錯誤的行是:

var weatherManager = WeatherManager()

在這里,您嘗試在不調用成員智能初始化程序的情況下創建WeatherManager ,因此 Swift 會為您提供錯誤消息。

如果您單擊錯誤消息本身,您將看到提供了修復,單擊它,Swift 會將您的代碼更改為:

var weatherManager = WeatherManager(delegate: <WeatherManagerDelegate?>)

Select <WeatherManagerDelegate?>並輸入您希望傳遞的值。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM