调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?

Posted

技术标签:

【中文标题】调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?【英文标题】:Missing argument for parameter 'delegate' in call // JSON file corrupted in SWIFT? 【发布时间】:2020-06-02 01:09:25 【问题描述】:

我正在关注 SWIFT // XCODE 11.4 的 e-class 教程,我必须从 Open Weather API 获取数据并将其显示在人们可以输入城市的界面上,并且视图控制器将显示温度、云图标, 和描述。

Clima App Tutorial

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

Swift Files in MVC Design Pattern

以下是每个重要文件中的代码:

我。模型文件夹

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"
        
    


二。控制器

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)
    



以下是错误消息:调用中的参数“委托”缺少参数 Error message in WeatherViewControl.swift

当我点击运行按钮时,调试控制台中也出现了这个错误:

dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "给定的数据不是有效的 JSON。", basedError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "字符 0 周围的值无效。 " UserInfo=NSDebugDescription=字符 0 周围的值无效。)))

Error in the debug console

我应该怎么做才能摆脱这些错误?

【问题讨论】:

【参考方案1】:

调用中的参数“委托”缺少参数

struct 被创建时,需要为每个属性创建一个值。

如果每个属性都指定了默认值并且没有用户定义的初始化器,那么 Swift 将为struct 创建一个默认初始化器

如果至少有一个属性没有默认值并且没有用户定义的初始化器,那么 Swift 将创建一个 memberwise 初始化器,它为每个没有默认值的属性设置一个参数。 p>

例如你的类型:

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 会为您提供错误消息。

如果您单击错误消息本身,您将看到提供了 Fix,单击它,Swift 会将您的代码更改为:

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

选择&lt;WeatherManagerDelegate?&gt; 并输入您希望传递的值。

HTH

【讨论】:

【参考方案2】:

您需要在struct WeatherManager 中将let delegate: WeatherManagerDelegate? 中的关键字“let”更改为“var”。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?的主要内容,如果未能解决你的问题,请参考以下文章

损坏的文件 - Angular 项目中 node_modules 中的 .xml2js.DELETE/package,json

使用 Swift 的 MKPolygon(调用中缺少参数“interiorPolygons”的参数)

下载的文件 MP3 文件通过 Swift 中的 NSURL Session 损坏

Swift 中的 PFUser logInWithUsernameInBackground - 参数“目标”调用缺少参数

Swift 中缺少参数错误的参数

无法在单元测试项目中的 Swift 中读取 JSON 文件