Переменная не обновляется — функция принимает переменную по умолчанию

#swift #swift5

#swift #swift5

Вопрос:

В моем ThirdScreenViewController я меняю переменную number на IBAction pressed .

 import Foundation
import UIKit

class ThirdScreenViewController: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()

        }
     var weatherManager = WeatherManager()
    var team = "leer"
    static var number = 1
    
    @IBAction func bayernMunchen(_ sender: UIButton) {
        team = "bayernMunchen"
    }
    @IBAction func borussiaDortmund(_ sender: UIButton) {
        team = "borussiaDortmund"
    }
    @IBAction func schalke(_ sender: UIButton) {
        team = "schalke"
    }
    @IBAction func pressed(_ sender: UIButton) {
        switch team {
        case "bayernMunchen":
        ThirdScreenViewController.number = 46
        case "borussiaDortmund":
        ThirdScreenViewController.number = 41
        case "schalke":
        ThirdScreenViewController.number = 45
        default: print(8)
        }
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let nextViewController = storyBoard.instantiateViewController(withIdentifier: "WeatherViewController") as! WeatherViewController
        self.present(nextViewController, animated:true, completion:nil)

    }
} 
  

В другом файле swift (не View Controller) у меня есть функция, которая принимает number и что-то с ней делает.

 import Foundation
import UIKit

var TeamOne = ""
var TeamTwo = ""
var ScoreOne = ""
var ScoreTwo = ""

var TeamThree = ""
var TeamFour = ""
var ScoreThree = ""
var ScoreFour = ""
var cityName = ThirdScreenViewController.number

struct WeatherManager {
    
    
    let weatherURL = "https://livescore-api.com/api-client/teams/matches.json?number=10amp;team_id=19amp;key=d33FTnnd6qwvEmjzamp;secret=BbO3REPYFXvb7fpkit0cQnpXNWssiL1Uamp;number=3amp;team_id=(cityName)"
    
    func fetchWeather () {
        let urlString = "(weatherURL)"
        perfromRequest(urlString: urlString)
        
    }
    
    func perfromRequest(urlString: String)
    {
        //1.Url erstellen
        if let url = URL(string: urlString) {
            //2. URLSession starten
            let session = URLSession(configuration: .default)
            //3. Give session a task
            let task =  session.dataTask(with: url) { (gettingInfo, response, error) in
                if error != nil{
                    print(error!)
                    return
                }
                
                if let safeFile = gettingInfo {
                    self.parseJSON(weatherFile: safeFile)
                }
            }
            //4. Start the task
            task.resume()
            
        }
    }
    
    //Das Ergebnis von oben wird hier ausgegeben
    func parseJSON(weatherFile: Data) {
        let decoder = JSONDecoder()
        do{
            let decodedFile =  try decoder.decode(WeatherFile.self, from: weatherFile)
            TeamOne = decodedFile.data[0].home_name
            ScoreOne = decodedFile.data[0].score
            
            TeamTwo = decodedFile.data[0].away_name
            ScoreTwo = decodedFile.data[0].score
            
            TeamThree = decodedFile.data[1].home_name
            ScoreThree = decodedFile.data[1].score
            
            TeamFour = decodedFile.data[1].away_name
            ScoreFour = decodedFile.data[1].score
          
            
        } catch {
            print(error)
        }
    }
   
}
  

В третьем файле swift я использую эту функцию weatherManager.fetchWeather() для вызова того, что происходит в моем втором файле swift.
Но вот в чем проблема. Она принимает переменную number со значением по умолчанию 1, а не со значением 41/46/45. Что я делаю не так?

Ответ №1:

В основном глобальные переменные вне любого класса и статические переменные для обмена данными — плохая практика.

Кроме того, чтобы получить идентификатор команды, динамически удаляйте строку

 var cityName = ThirdScreenViewController.number
  

В структуре заменить

 let weatherURL = "https://livescore-api.com/api-client/teams/matches.json?number=10amp;team_id=19amp;key=d33FTnnd6qwvEmjzamp;secret=BbO3REPYFXvb7fpkit0cQnpXNWssiL1Uamp;number=3amp;team_id=(cityName)"
  

с

 let weatherURL = "https://livescore-api.com/api-client/teams/matches.json?number=10amp;team_id=19amp;key=d33FTnnd6qwvEmjzamp;secret=BbO3REPYFXvb7fpkit0cQnpXNWssiL1Uamp;number=3amp;team_id="
  

и

 let urlString = "(weatherURL)"
  

с

 let urlString = weatherURL   String(ThirdScreenViewController.number)
  

Примечание: Подумайте о переименовании материалов, связанных с погодой, в материалы, связанные с командой

Комментарии:

1. Спасибо, это сработало. Если я могу спросить. Почему мой код не сработал? Это из-за переменной CityName, которую я использовал? Я думаю, я должен использовать ThirdScreenViewController.number напрямую? И вы сказали, что я не должен так делать. Можете ли вы назвать альтернативу?

2. Потому что cityName инициализируется при создании вложенного файла Swift и не обновляется при изменении статического значения. Вы всегда должны инкапсулировать данные в структурах или перечислениях.