Как сортировать пользовательские объекты в соответствии с определенным порядком сортировки, используя swift codable - PullRequest
0 голосов
/ 07 января 2019

Как сортировать настраиваемые объекты по быстрому кодированию в соответствии с определенным порядком сортировки. Я использую быстрый кодируемый протокол.

{
    "data": {
        "team": [
              {
                "name": "XYZ",
                "designation": "Managing director - South Asia"
              },
              {
                "name": "XYZ",
                "designation": "Managing director - South Asia"
              }
            ],
        "recruiterName": "Lorium Ipsem text",
        "respondsQuickly": "1"
    },
    "metaData": {
                "sortOrder": [
                  "respondsQuickly",
                  "recruiterName",
                  "team"
                ]
              }
}

Здесь мне нужно отсортировать объекты данных в соответствии с объектом sortOrder. Теперь это модельный объект

struct Welcome: Codable {
let data: DataClass?
let metaData: MetaData?
}
struct JDDataClass: Codable {
   let team: [Team]?
   let recruiterName, respondsQuickly: String?
}

struct Team: Codable {
   let name, designation: String?
}
struct JDMetaData: Codable {
let sortOrder: [String]?
}

Я не могу искать All Keys также как его модель. Теперь это не JSON или Dictionary, а пользовательский объект из протокола Codabale swift.

Желаемый вывод:

let myArray = [
        {"respondsQuickly": "1"},
        {"recruiterName": "Lorium Ipsem text"},
        {"team": [
              {
                "name": "XYZ",
                "designation": "Managing director - South Asia"
              },
              {
                "name": "XYZ",
                "designation": "Managing director - South Asia"
              }
            ]
        }
    ]

Ответы [ 2 ]

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

Это код рабочей площадки. Вы можете проверить это. Я надеюсь, это поможет. arrResult держит ваш ответ.

struct Welcome: Codable {
let data: JDDataClass?
let metaData: JDMetaData?
}
struct JDDataClass: Codable {
let team: [Team]?
let recruiterName, respondsQuickly: String?
}

struct Team: Codable {
let name, designation: String?
}
struct JDMetaData: Codable {
let sortOrder: [String]?
}

let multiLineString = """
{
"data": {
"team": [
{
"name": "XYZ",
"designation": "Managing director - South Asia"
},
{
"name": "XYZ",
"designation": "Managing director - South Asia"
}
],
"recruiterName": "Lorium Ipsem text",
"respondsQuickly": "1"
},
"metaData": {
"sortOrder": [
"respondsQuickly",
"recruiterName",
"team"
]
}
}
"""
extension Encodable {
subscript(key: String) -> Any? {
    return dictionary[key]
}
var dictionary: [String: Any] {
    return (try? JSONSerialization.jsonObject(with: JSONEncoder().encode(self))) as? [String: Any] ?? [:]
 }
 }
 let decoder = JSONDecoder()

 do {
if let data = multiLineString.data(using: String.Encoding.utf8, allowLossyConversion: false){
  let json = try decoder.decode(Welcome.self, from: data)
    var arrResult = [[String : Any]]()
    if let sortOrder = json.metaData?.sortOrder {
       for item in sortOrder {
        if let data = json.data {
            if let obj = data[item] {
                arrResult.append([item: obj])
            }
        }
    }
        print(arrResult)
 }
 }
 } catch {
print(error)
 }
0 голосов
/ 08 января 2019

Сортировка по ключам структуры не имеет никакого смысла. когда стоимость доступа к каждому элементу одинакова, почему вы хотите отсортировать переменные объекта.

Возможно, ваша текущая структура неверна.

{
  "data": {
    "team": [
      {
        "name": "XYZ",
        "designation": "Managing director - South Asia"
      },
      {
        "name": "XYZ",
        "designation": "Managing director - South Asia"
      }
    ],
    "recruiterName": "Lorium Ipsem text",
    "respondsQuickly": "1"
  },
  "metaData": {
    "sortOrder": [
      "respondsQuickly",
      "recruiterName",
      "team"
    ]
  }
}

Это имело бы больше смысла, если бы вы хотели вышеупомянутый вывод с такой структурой:

{
  "data": {
    "keys": [
      "team",
      "recruiterName",
      "respondsQuickly"
    ],
    "values": [
      [
        {
          "name": "XYZ",
          "designation": "Managing director - South Asia"
        },
        {
          "name": "XYZ",
          "designation": "Managing director - South Asia"
        }
      ],
      "Lorium Ipsem text",
      "1"
    ]
  },
  "metaData": {
    "sortOrder": [
      "respondsQuickly",
      "recruiterName",
      "team"
    ]
  }
}

Тем не менее, если вы хотите добиться этого вывода с вашей текущей структурой, вы можете использовать что-то вроде: Отражение , чтобы прочитать свойства структуры во время выполнения и отсортировать ее соответствующим образом. Излишне говорить, что это решение ужасно и его следует избегать.

...