как я могу отфильтровать студента со всеми деталями, чье «активное» значение равно «true»? - PullRequest
0 голосов
/ 12 мая 2018

Я хочу отфильтровать все детали (школа, город, имя, активный), чье активное значение равно true.Я сохранил значение ключа "детали"

let details = jsonRes[RequestResponses.Keys.details.rawValue] as? Dictionary< String, Any>

    {
      "details": {
        "code": 235,
        "school": "sp school",
        "students": [
          { "name": "1student", "Active": false },
          { "name": "2student", "Active": true },
          { "name": "3student", "Active": true },
          { "name": "4student", "Active": false },
          { "name": "5student", "Active": false}
        ]
      }
    }

Ожидаемый результат

    [
      "details": {
        "code": 235,
        "school": "sp school",
        "students": [
          { "name": "2student", "Active": true },
          { "name": "3student", "Active": true }
        ]
      }
    ]

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Вы начинаете понимать истинную элегантность Swift, как только начинаете превращать это в обычные объекты, используя Codable. Это позволит вам делать вещи, как на детской площадке:

import Cocoa

let jsonData = """
    {
        "details": {
            "code": 235,
            "school": "sp school",
            "students": [
                { "name": "1student", "Active": false },
                { "name": "2student", "Active": true },
                { "name": "3student", "Active": true },
                { "name": "4student", "Active": false },
                { "name": "5student", "Active": false}
            ]
        }
    }
    """.data(using: .utf8)!

struct Student : Codable {
    let name: String
    let active: Bool

    enum CodingKeys: String, CodingKey {
        case name
        case active = "Active"
    }
}

struct School : Codable {
    let code: Int
    let school: String
    let students: [Student]
}

struct Details: Codable {
    let details: School
}

do {
    let det = try JSONDecoder().decode(Details.self, from: jsonData)
    print(det)

    let activeStudents = det.details.students.filter({(student)->Bool in student.active})
    print(activeStudents)
} catch {
    print(error)
}

Это, очевидно, намного проще для понимания, и XCode может также намного лучше поддерживать вас в процессе. Усилия, затраченные на анализатор, минимальны и легко восстанавливаются благодаря чистой элегантности и четкости конечной линии фильтрации.

0 голосов
/ 12 мая 2018

Вы можете использовать filter

   if let details = jsonRes[RequestResponses.Keys.details.rawValue] as?  Dictionary< String, Any> ,
            let detailDic = details["details"] as? [String:Any],
            let students  = detailDic["students"]  as? [[String:Any]] {

            let activeStudents = students.filter { (item) -> Bool in
                guard let active  = item["Active"] as? Bool else {return false}
                return active
            }
            print(activeStudents)
        }

или вы можете использовать shourthand

     if let details = jsonRes[RequestResponses.Keys.details.rawValue] as?  Dictionary< String, Any> ,
                let detailDic = details["details"] as? [String:Any],
                let students  = detailDic["students"]  as? [[String:Any]] {

                let activeStudents = (details["students"] as? 
                [[String:Any]])?.filter{ $0["Active"] as? Bool == true}
                print(activeStudents)
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...