Создание словарного класса со статическими данными (Swift) - PullRequest
1 голос
/ 08 ноября 2019

Мне нужна помощь в создании класса, который будет служить основой для всего статического контента, который будет использовать мое приложение, например, классификация штатов, городов, стран, компаний. Я не ожидаю, что они изменятся с течением времени (или их будет очень мало).

В качестве справки я сейчас рассмотрим страны и города (логика будет одинаковой для всех остальных)

Страна класса:

import UIKit

class Country { 
    var name: String 
    var cities: [City]

    init(name:String, cities:[City]) {
        self.name = name
        self.cities = cities
    }
}

Город класса:

import UIKit

class City { 
    var name: String 

    init(name:String) {
        self.name = name
    }
}

В моем существующем коде я использую ссылку на эти 2 класса, но я передаю данные в свойViewController.

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var countryLbl: UILabel!

    var countries = [Country]()

    override func viewDidLoad() {
        super.viewDidLoad()
        pickerView.delegate = self
        pickerView.dataSource = self

        // Adding Countries and Cities
        countries.append(Country(name: "UK", cities: [City(name: "London"),City(name: "Manchester"), City(name: "Bristol")]))
        countries.append(Country(name: "USA", cities: [City(name: "New York"),City(name: "Chicago")]))
        countries.append(Country(name: "China", cities: [City(name: "Beijing"),City(name: "Shanghai"), City(name: "Shenzhen"), City(name: "Hong Kong")]))

    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 2
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if component == 0 {
            return countries.count
        } else {
            let selectedCountry = pickerView.selectedRow(inComponent: 0)
            return countries[selectedCountry].cities.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0 {
             return countries[row].name
         } else {
             let selectedCountry = pickerView.selectedRow(inComponent: 0)
             return countries[selectedCountry].cities[row].name
         }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        pickerView.reloadAllComponents()

        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        let selectedCity = pickerView.selectedRow(inComponent: 1)
        let cityR = countries[selectedCountry].cities[selectedCity].name

        countryLbl.text = "The right answer was: in \(selectedCountry) in \(cityR)"
    }    
}

Чтобы сделать мой код чище, я хотел переместить код ниже в другой класс и вызвать его из моего ViewController

    // Adding Countries and Cities
    countries.append(Country(name: "UK", cities: [City(name: "London"),City(name: "Manchester"), City(name: "Bristol")]))
    countries.append(Country(name: "USA", cities: [City(name: "New York"),City(name: "Chicago")]))
    countries.append(Country(name: "China", cities: [City(name: "Beijing"),City(name: "Shanghai"), City(name: "Shenzhen"), City(name: "Hong Kong")]))

}

, замененного чем-то вроде

   let countriesAndCities = Dicitionary.getCountriesAndCities
   // Here I would expect countriesAndCities to have the same content as countries.append(...) above.

Это выполнимо?

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2019

Согласно ответу rmaddy, вы можете создать свой собственный файл json:

  1. Создайте свой пустой файл, сохраните его как файл json, и там вы сможете вставить страны и города.

enter image description here

enter image description here

enter image description here

Пожалуйста, посмотрите код, как я реализую pickerView в viewController ..

enter image description here

enter image description here

ЕслиВы можете заметить, что я напечатал "countryList" в своем коде ниже, чтобы я мог проверить, не является ли массив countryJson не пустым. (Пожалуйста, проверьте ваши журналы)

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...