Как опубликовать sh изменений в одном объекте в массиве объектов - PullRequest
0 голосов
/ 17 марта 2020

У меня есть следующие классы

class ListItem: Identifiable {
    var id: UUID
    var name: String
    var description: String
    var isFavorite: Bool

    var debugDescription: String {
        return "Name: \(self.name) | Favorite?: \(self.isFavorite)"
    }

    public init(name: String) {
        self.name = name
        id = UUID()
        self.description = "Some text describing why \(self.name.lowercased()) is awesome"
        self.isFavorite = false
    }
}


class ListItems: ObservableObject {
    @Published var items: [ListItem]

    let defaultAnimals = ["Ant", "Bear", "Cat", "Dog", "Elephant", 
          "Fish", "Giraffe", "Hyena", "Iguana", "Jackal", "Kingfisher", "Leopard", "Monkey"]

    public init(animals: [String] = []) {
        let animalList: [String] = animals.count > 0 ? animals : defaultAnimals
        self.items = animalList.sorted {
            $0.lowercased() < $1.lowercased()
        }.map {
            ListItem(name: $0.firstUppercased)
        }
    }
}

и следующий вид изображения в ContentView

struct ContentView: View {
    @ObservedObject var list: ListItems = ListItems()
    var body: some View {
        List(list.items) {
            animal in HStack {
                // ...
                Image(systemName: animal.isFavorite ? "heart.fill" : "heart").foregroundColor(.pink).onTapGesture {
                    let index = self.list.items.firstIndex { $0.id == animal.id } ?? -1
                    if (index >= 0) {
                        self.list.items[index].isFavorite = !animal.isFavorite
                        self.list.items = Array(self.list.items[0...self.list.items.count-1]) // <--
                    }
                }
                // ...
            }
        }
    }
}

Каждый раз, когда отображается вид изображения, я в основном переназначаю весь массив вот так, чтобы изменения могли быть отражены в пользовательском интерфейсе

self.list.items = Array(self.list.items[0...self.list.items.count-1])

Мой вопрос : Как я могу реорганизовать свой код, чтобы предотвратить переназначение всего массива объектов при каждом изменении свойств объекта?

Я довольно новичок в разработке Swift & iOS, но не уверен, что что-то упустил из-за c.

1 Ответ

1 голос
/ 17 марта 2020

Объявите ListItem как struct вместо класса, таким образом представление будет уведомлено, когда isFavorite изменится. И просто небольшое предложение; Вы можете использовать переключатель, чтобы изменить значение логического значения: self.list.items[index].isFavorite.toggle()

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