Swift: возможно перегрузить randomVar как? [MyStruct]? - PullRequest
0 голосов
/ 09 мая 2019

Мой сервер возвращает массив информации о фотографиях в формате JSON, например:

"pics":[{"ID":182,"ID_member":39,"fn":"b69ea6f6c88b58c67a331aa3c5eaff81.jpg"}, ...]

У меня есть функция struct init, созданная для обработки одного массива необработанных фотографий json (из типа [String: Any]):

init?(fromRaw _img:[String:Any]?)
{
    guard
    let img   = _img,
    let id    = img["ID"] as? Int,
    let idm   = img["ID_member"] as? Int,
    let fn    = img["fn"] as? String
    else
    {
        OOTLog.info("Warning : unable to init from photo raw array")
        return nil ;
    }


    self.id = id
    self.idMembre = idm
    self.fileName = fn

}

Мой вопрос: допустим, у нас есть json с сервера (типа [[String: Any]], массив из n необработанных фотографий), есть ли способ «перегрузить» as? [Photo] с моим init?(fromRaw:) внутри Структура фото, чтобы мы могли просто кодировать:

guard let arrayPhoto = jsonRaw as? [Photo] else ..

Вместо:

guard let arrayPhotoRaw = jsonRaw as [[String:Any]] else .. 
let photoArray:[Photo] = []
for p in jsonRaw {
    guard let p = Photo(fromRaw:p) else { continue }
    photoArray.append(p)
}

1 Ответ

1 голос
/ 09 мая 2019

Лучше использовать

struct Root: Codable {
    let pics: [Pic]
}

struct Pic: Codable {
    let id, idMember: Int
    let fn: String

    enum CodingKeys: String, CodingKey {
        case id = "ID"
        case idMember = "ID_member"
        case fn
    }
}

 let res = try! JSONDecoder().decode(Root.self, from:data)
 print(res.pics)
...