Как отсортировать JSON в swift на основе персидских символов - PullRequest
0 голосов
/ 10 мая 2018

я новичок в swift, я собираюсь отсортировать файл json в связке, а не по коду, есть ли способ сортировки файла по коду или нет, я хочу отсортировать его по "citname": "لومار"

json-файл:

{


    "data":[
        {
            "_id":1,
            "citproidint":4,
            "citname":"لومار"
        },
        {
            "_id":2,
            "citproidint":4,
            "citname":"ايوان"
        },
        {
            "_id":3,
            "citproidint":12,
            "citname":"آبعلی"
        },
        {
            "_id":4,
            "citproidint":25,
            "citname":"نيشابور"
        },
        {
            "_id":5,
            "citproidint":27,
            "citname":"سقز"
        }, 

        ]

}

... // 827 id находится в этом json-файле, и для каждого блока в этом json-файле я анализирую вот так, и все в порядке, но я хочучтобы использовать сортировку в моем окне выбора, тогда мне нужно сохранить отсортированные модалы

guard let path = Bundle.main.path(forResource: "citybig", ofType: "json") else { return }
// city Text  file:// ...
let url = URL(fileURLWithPath: path)
do {
    // data explained in bytes
    let data = try Data(contentsOf: url)
    // we get the json file text
    let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
    // put json in nsdictinary so we can access each index and person sooo ... id and more

    for (key,value) in json as! NSDictionary {
        if (key as! String) == "data" {
            let value2 = value.s
            for each in value as! [[String: Any]] {
        let singleCityModal = cityModal()
    for (key,value) in each {
        switch key {
        case "_id" :
            singleCityModal.id = value as? Int
        case "citproidint" :
            singleCityModal.citproidint = value as? Int
        case "citname" :
            singleCityModal.citname = value as? String
        default:
            break
            }
        } 
   cityFirstModal.append(singleCityModal)
    }

    cityFinalModal.append(contentsOf: cityFirstModal)

1 Ответ

0 голосов
/ 24 июля 2018

Ваш способ анализа данных довольно странный, в Swift 4 есть более удобный способ - протокол Decodable.

Вам нужны две структуры:

struct CityData : Decodable {
    private enum CodingKeys: String, CodingKey { case cities = "data"}

    let cities : [City]
}

struct City : Decodable {
    private enum CodingKeys: String, CodingKey { case id = "_id", citproidint, name = "citname"}

    let id, citproidint: Int
    let name : String
}

икод для анализа JSON становится немного короче (и более эффективным)

let url = Bundle.main.url(forResource: "citybig", withExtension: "json")!
let data = try! Data(contentsOf: url)
let cityData = try! JSONDecoder().decode(CityData.self, from: data)

Восклицательные знаки предназначены.Поскольку (неизменяемый) файл находится в комплекте, код не должен аварийно завершать работу.Если это так, то вы допустили ошибку при проектировании.

Это всего лишь одна дополнительная строка для сортировки городов по citproidint

let sortedCities = cityData.cities.sorted(by: {$0.citproidint < $1.citproidint})

Я не знаком с фарси, но если вы хотите отсортироватьname селектор localizedStandardCompare может выполнять работу

let sortedCities = cityData.cities.sorted(by: {$0.name.localizedStandardCompare($1.name) == .orderedAscending })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...