Изменить значение в массиве словаря swift 5 - PullRequest
1 голос
/ 23 мая 2019

Я использую xcode 10.2 и swift 5

Мне нужно изменить все значения с " selected " key = false / true в " arrNotificationList "

    // Create mutable array
    var arrNotificationList = NSMutableArray()

    // viewDidLoad method code
    arrNotificationList.addObjects(from: [
        ["title":"Select All", "selected":true],
        ["title":"Match Reminder", "selected":false],
        ["title":"Wickets", "selected":false],
        ["title":"Half-Centure", "selected":false],
        ])

Я пытаюсь использовать приведенный ниже код, но исходное значение массива" arrNotificationList "не изменилось.

        arrNotificationList.forEach { value in
            print("\(value)")
            var dictNotification:[String:Any] = value as! [String : Any]
            dictNotification["selected"] = sender.isOn // this is switch value which is selected by user on/off state
        }

Ответы [ 2 ]

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

Для изменения элементов массива используйте функцию map вместо forEach.Затем верните изменение измененного словаря в функцию карты

var arrNotificationList = [[String:Any]]()

arrNotificationList = [["title":"Select All", "selected":true],
                        ["title":"Match Reminder", "selected":false],
                        ["title":"Wickets", "selected":false],
                        ["title":"Half-Centure", "selected":false]]
arrNotificationList = arrNotificationList.map({
    var dict = $0
    dict["selected"] = sender.isOn
    return dict
})
print(arrNotificationList)
1 голос
/ 23 мая 2019

Прежде всего, вместо использования NSMutableArray используйте Swift массив типа [[String:Any]], т.е.

var arrNotificationList = [[String:Any]]() //array of dictionaries

arrNotificationList.append(contentsOf: [
    ["title":"Select All", "selected":true],
    ["title":"Match Reminder", "selected":false],
    ["title":"Wickets", "selected":false],
    ["title":"Half-Centure", "selected":false],
    ])

Теперь, поскольку это array of dictionary, а dictionary является типом значения, поэтому любые изменения, внесенные в него в foreach loop, не будут отражаться в исходном dictionary.

Используйте map(_:), чтобы получить новый массив с selected = sender.isOn для всех массивов dictionaries в arrNotificationList.

        arrNotificationList = arrNotificationList.map {
            ["title": $0["title"], "selected": sender.isOn]
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...