SwiftUI Observable не обновляется при использовании переменной
По какой-то причине при назначении объекта Observable переменной и последующем его изменении представление не обновляется. но если я обращаюсь к нему напрямую по его индексу, он:
Не получится:
var people = self.mypeople.people[0]
people.name = 'test'
Работает:
self.mypeople.people[0].name = 'test'
Я думаю, что-то насчет ссылок, но я не уверен:(
Пример кода:
//: A UIKit based Playground for presenting user interface
import SwiftUI
import PlaygroundSupport
import Combine
struct Person: Identifiable{
var id: Int
var name: String
init(id: Int, name: String){
self.id = id
self.name = name
}
}
class People: ObservableObject{
@Published var people: [Person]
init(){
self.people = [
Person(id: 1, name:"Javier"),
Person(id: 2, name:"Juan"),
Person(id: 3, name:"Pedro"),
Person(id: 4, name:"Luis")]
}
}
struct ContentView: View {
@ObservedObject var mypeople: People = People()
var body: some View {
VStack{
ForEach(mypeople.people){ person in
Text("\(person.name)")
}
Button(action: {
var people = self.mypeople.people[0]
// this howver works:
// self.mypeople.people[0].name = 'Test'
people.name="Jaime2"
}) {
Text("Change name")
}
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
1 ответ
Ваша догадка верна!!
Объект People - это ссылочный тип, а объект Person - это тип значения.
Из здесь я могу проверить тип объекта с помощью этого кода:
func isReferenceType(toTest: Any) -> Bool {
return type(of: toTest) is AnyObject
}
isReferenceType(toTest: Person(id: 1, name:"Javier")) //false
isReferenceType(toTest: People()) //true
Так что, когда вы получите человека по этой линии var people = self.mypeople.people[0]
, он просто получает и создает нового человека (адрес этого объекта отличается от объекта self.mypeople.people[0]), поэтому в этом случае вы ожидаете изменения ваших данных в массиве, вы должны установить self.mypeople.people[0] = people
после изменения people.name
ЗДЕСЬ для получения дополнительной информации о ссылочном типе и типе значения