![](/img/trans.png)
[英]Adding a SwiftUI view to a UIKit app gives me a `Missing argument for parameter 'font' in call` error
[英]Missing argument for parameter 'delegate' in call // JSON file corrupted in SWIFT?
我正在學習 SWIFT // XCODE 11.4 的電子課程教程,我必須從 Open Weather API 獲取數據並將其顯示在人們可以輸入城市的界面上,視圖 controller 將顯示溫度、雲圖標和描述.
我正在使用 MVC 模式設計和委托設計來完成本教程。 我的swift文件如下:
以下是每個重要文件中的代碼:
一、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.