Как получить массив в порядке возрастания на основе значения ключа в Swift3 iOS - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю приложение базы данных в Swift3, где мне нужно отобразить данные в UITableView из JSON.Ниже мои JSON:

{
    "Success": 1,
    "data": [{
        "Session_Details": [{
                "Start_Time": "08:00",
                "End_Time": "10:00",
                "Tag_Details": [{
                    "Tag_Id": 1,
                    "Tag_Name": "Test 1",
                    "Tag_Order": 4
                }]
            },
            {
                "Start_Time": "10:30",
                "End_Time": "12:30",
                "Tag_Details": [{
                    "Tag_Id": 2,
                    "Tag_Name": "Test 2",
                    "Tag_Order": 1
                }]
            },
            {
                "Start_Time": "10:30",
                "End_Time": "12:30",
                "Tag_Details": [{
                    "Tag_Id": 3,
                    "Tag_Name": "Test 3",
                    "Tag_Order": 3
                }]
            },
            {
                "Start_Time": "13:30",
                "End_Time": "15:20",
                "Tag_Details": [{
                    "Tag_Id": 1,
                    "Tag_Name": "Test 1",
                    "Tag_Order": 4
                }]
            }
        ]
    }]
}

Я уже проанализировал JSON и получил все данные JSON.

Моя проблема в том, что я должен создать массив тегов Tag_Details, который должен иметь уникальное значение. Это означает, что Tag_Id должен быть уникальным.Кроме того, я должен установить массив в порядке ascending на основе ключа Tag_Order.

Я пытаюсь код ниже, но не работает:

var sessions : [SessionData]! {
        return AgendaDataManager.sharedInstance.sessionData
}

let sortedResults = session.tagDetails!.sortedArray(using: [NSSortDescriptor(key: "tagOrder", ascending: true)])

let sessionTag = ((session.tagDetails as AnyObject).allObjects as! [TagData])[0]

Пожалуйста, предложите мне.Спасибо.

1 Ответ

0 голосов
/ 10 февраля 2019

Если вы кодируете в Swift 3 и не можете работать с протоколом Codable

Сначала вы должны структурировать данные JSON.Вы можете использовать этот вспомогательный быстрый тип , который даст довольно хорошую начальную точку:

struct Root {
    let success: Bool
    let data: [Datum]
}

struct Datum {
    let sessionDetails: [SessionDetail]
}

struct SessionDetail {
    let startTime: String
    let endTime: String
    let tagDetails: [TagDetail]
}

struct TagDetail {
    let tagId: Int
    let tagName: String
    let tagOrder: Int
}

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

typealias Dictionary = [String: Any]
typealias Dictionaries = [[String: Any]]

extension Root {
    init?(_ data: Data) {
        let dictionary = (try? JSONSerialization.jsonObject(with: data)) as? Dictionary ?? [:]
        success = dictionary["Success"] as? Bool == true
        guard success else {
            return nil
        }
        self.data = (dictionary["data"] as! Dictionaries).map(Datum.init)
    }
}

И инициализаторы, которые принимают словарь для всех структур.

extension Datum {
    init(dictionary: [String: Any]) {
        sessionDetails = (dictionary["Session_Details"] as! Dictionaries)
            .map(SessionDetail.init)
    }
}

extension SessionDetail {
    init(dictionary: [String: Any]) {
        startTime = dictionary["Start_Time"] as! String
        endTime = dictionary["End_Time"] as! String
        tagDetails = (dictionary["Tag_Details"] as! Dictionaries).map(TagDetail.init)
    }
}

extension TagDetail: CustomStringConvertible {
    init(dictionary: [String: Any]) {
        tagId = dictionary["Tag_Id"] as! Int
        tagName = dictionary["Tag_Name"] as! String
        tagOrder = dictionary["Tag_Order"] as! Int
    }
    var description: String {
        return "TagDetail(Id: \(tagId) - Name: \(tagName) - Order: \(tagOrder))"
    }
}

Далее вам необходимо настроить TagDetail на соответствие Equatable и Comparable.:

extension TagDetail: Equatable, Comparable {
    static func == (lhs: TagDetail, rhs: TagDetail) -> Bool {
        return lhs.tagId == rhs.tagId
    }
    static func < (lhs: TagDetail, rhs: TagDetail) -> Bool {
        return lhs.tagOrder < rhs.tagOrder
    }
}

Как только вы выполните все эти шаги, вы можете легко фильтровать и сортировать ваши объекты:


let data = Data("""
{
"Success": 1,
"data": [{
"Session_Details": [{
"Start_Time": "08:00",
"End_Time": "10:00",
"Tag_Details": [{
"Tag_Id": 1,
"Tag_Name": "Test 1",
"Tag_Order": 4
}]
},
{
"Start_Time": "10:30",
"End_Time": "12:30",
"Tag_Details": [{
"Tag_Id": 2,
"Tag_Name": "Test 2",
"Tag_Order": 1
}]
},
{
"Start_Time": "10:30",
"End_Time": "12:30",
"Tag_Details": [{
"Tag_Id": 3,
"Tag_Name": "Test 3",
"Tag_Order": 3
}]
},
{
"Start_Time": "13:30",
"End_Time": "15:20",
"Tag_Details": [{
"Tag_Id": 1,
"Tag_Name": "Test 1",
"Tag_Order": 4
}]
}
]
}]
}
""".utf8)

if let root = Root(data), root.success,
    let sessionDetails = root.data.first?.sessionDetails {
    for detail in sessionDetails {
        print(detail)
    }
    let allTagDetails = sessionDetails.flatMap{$0.tagDetails}
    let tagDetailsSorted = allTagDetails.sorted()
    print("\n\n\n")
    var set = Set<Int>()
    let tagDetailsSortedSet = tagDetailsSorted.filter({ set.insert($0.tagId).inserted })
    tagDetailsSortedSet.map{print($0)}
}

Это напечатает

SessionDetail (startTime: "08:00", endTime: "10:00", tagDetails: [TagDetail (Id: 1 - имя: тест 1 - заказ: 4)])

SessionDetail (startTime: «10:30», endTime: «12:30», tagDetails: [TagDetail (Id: 2 - имя: тест 2 - порядок: 1)])

SessionDetail (startTime:«10:30», endTime: «12:30», tagDetails: [TagDetail (Id: 3 - имя: тест 3 - заказ: 3)])

SessionDetail (startTime: «13:30»,Endtime: "15:20", tagDetails: [TagDetail (Id: 1 - Имя: Тест 1 - Заказ: 4)])

и

TagDetail (Id: 2 - Имя: Тест 2 - Заказ: 1)

TagDetail (Id: 3 - Имя: Тест 3 - Заказ: 3)

TagDetail (Id: 1 - Имя: Тест 1 -Заказ: 4)

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