Добавить структуру элементов в массив - PullRequest
0 голосов
/ 11 октября 2018

У меня есть структура, и я хочу получить количество элементов в ней и добавить значения в массив, но не могу найти способ сделать это.

struct User_notification_preferences : Codable {
  let comments : Bool?
  let likes : Bool?
  let dislikes : Bool?
  let unfollow : Bool?
  let follow : Bool?
  let updates : Bool?
}
enum CodingKeys: String, CodingKey {
    case follow = "follow"
    case likes = "likes"
    case unfollow = "unfollow"
    case comments = "comments"
    case updates = "updates"
    case dislikes = "dislikes"
}

init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    follow = try values.decodeIfPresent(Bool.self, forKey: .follow)
    unfollow = try values.decodeIfPresent(Bool.self, forKey: .unfollow)
    likes = try values.decodeIfPresent(Bool.self, forKey: .likes)
    dislike = try values.decodeIfPresent(Bool.self, forKey: .dislikes)
    comments = try values.decodeIfPresent(Bool.self, forKey: .comments)
    updates = try values.decodeIfPresent(Bool.self, forKey: .updates)

}

Я использую это, чтобы показать и обновить значения UISwitch на основе ответа бэкэнда.Каков был бы лучший способ сделать это?Ниже приведен вывод после декодирования ответа JSON, и я хочу получить желаемый вывод в виде массива словаря [[String: Bool]].

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете закодировать его в пару ключ-значение, а затем получить все, что захотите:

let userNotiPre  = User_notification_preferences()
let jsonDatas = try JSONEncoder().encode(userNotiPre)

if let dict = try JSONSerialization.jsonObject(with: jsonDatas, options: []) as? [String: Hashable]{
   //Get all values from dict and then you can also get count of that array 
   let array = dict.values
   array.count
}
0 голосов
/ 11 октября 2018

Вы можете использовать зеркало:

let pref = User_notification_preferences(comments: true, likes: false, dislikes: nil, unfollow: true, follow: nil, updates: false)

let prefMirror = Mirror(reflecting: pref)

var switchStatus: [String:Bool] = [String:Bool]()

prefMirror.children.forEach { child in
    guard let label = child.label else {
        fatalError("Couldn't get the label")
    }
    switchStatus[label] = child.value as? Bool ?? false
}

print(switchStatus) //["follow": false, "updates": false, "unfollow": true, "dislikes": false, "likes": false, "comments": true]

Это будет работать, даже если вы измените свойства User_notification_preferences.

Или вы можете использовать наивную функцию, подобную этой:

struct User_notification_preferences : Codable {
    //...
    func dictionaryRepresentation() -> [String:Bool] {
        return ["comments": comments ?? false,
                "likes": likes ?? false,
                "dislikes": dislikes ?? false,
                "unfollow": likes ?? false,
                "follow": likes ?? false,
                "updates": likes ?? false
        ]
    }
}

И используйте это так:

print(pref.dictionaryRepresentation()) //["follow": false, "updates": false, "comments": true, "likes": false, "dislikes": false, "unfollow": false]
...