Отфильтруйте массив словарей и измените его атрибуты. - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть массив словарей var songsByLetters = [(key: String, value: [Song])](), пользователь выбрал песню и поместит ее в избранное.Поэтому мне нужно будет изменить выбранную песню id isFaved boolean на true.

До того, как у меня появится массив объектов песни без первых букв песни в качестве ключей к новому словарю.И я делал это, когда пользователь нажимал кнопку фаворита.

@IBAction func favButtonTapped(_ sender: UIButton) {
   dbSongs.filter({$0.id == selectedSongId}).first?.isFaved = sender.isSelected
}

Теперь, когда у меня есть словари, я пытаюсь сделать это, но это не только правильный путь, и у меня, конечно, есть ошибка.

Невозможно преобразовать значение типа '()?'чтобы закрыть тип результата 'Bool'

songsByLetters.filter{$0.value.filter{$0.id == selectedSongId}.first?.isFaved = sender.isSelected}

Я понимаю ошибку, но я не знаю, как отфильтровать этот словарь и изменить атрибут isFaved этой определенной песни id

Вот структура песни:

[
"H":[
       {
         "id": 2134,
         "name": "Happy Brithday",
         "artist": "Paul Anka",
         "isFaved": false,
         "code": "380dj0a"
       },
       {
         "id": 38304,
         "name": "How can i stop loving you",
         "artist": "Savage Garden",
         "isFaved": false,
         "code": "kkdj0a"
       }
   ]
]

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Вместо того, чтобы хранить только id, сохраняйте все Song.

var selectedSong : Song?

...

self.selectedSong = songsByLetters[indexPath.section].value[indexPath.row]

Наиболее эффективное решение - объявить Song как класс со ссылочной семантикой, тогда вам вообще не нужно фильтровать

@IBAction func favButtonTapped(_ sender: UIButton) {
    selectedSong?.isFaved = sender.isSelected
}

Примечание: вы не можете использоватькортеж (ваш словарь на самом деле является кортежем) в качестве источника данных.

0 голосов
/ 26 ноября 2018

Я думаю, что следующий код работает

  struct Song {
        let id: Int
        let name: String
        let artist: String
        var isFaved: Bool
        let code: String
    }

    var songsByLetter: [String: [Song]] = ["H" : [Song(id: 2134, name: "Happy Birthday", artist: "Paul Anka", isFaved: false, code: "380dj0a"),Song(id: 38304, name: "How can i stop loving you", artist: "Savage Garden", isFaved: false, code: "kkdj0a")]]



    let selectedSongId = 38304
    var songs = songsByLetter.values.map({$0.filter({$0.id == selectedSongId})})

    if let songByH = songs.first, var song = songByH.first
    {
        song.isFaved = true
        let firstLetter = String(song.name.first ?? "0")
        let index = songsByLetter[firstLetter]?.firstIndex(where: {$0.id == selectedSongId})
        if let index = index
        {
            (songsByLetter[firstLetter])?.remove(at: index)
            songsByLetter[firstLetter]?.insert(song, at: index)
        }
    }

    print(songsByLetter)
0 голосов
/ 26 ноября 2018

// Сначала вы можете отфильтровать объект

let filtered = dbSongs.filter({$0.id == selectedSongId}).first

// затем удалить из списка

let index = dbSongs.index { $0.id == filtered.id }

  if let index = index {
        let removed = dbSongs.remove(at: index) // Remove item
  }

// Обновить данные

removed.isFaved = true

//наконец, вставить в список.

dbSongs.insert(removed, at index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...