import Foundation
struct Person: Identifiable{
let id = UUID()
var name: String
var age: Int
var job: String
var myPerson: Bool
}
class Model: ObservableObject {
@Published var people: [Person] = []
@Published var myPeople: [Person] = []
init(){
addPeople()
}
func addPeople(){
people = peopleData
myPeople = peopleData.filter { $0.myPerson }
}
}
var peopleData = [
person(name: "Bob", age: 22, job: "Student", myPerson: false),
person(name: "John", age: 26, job: "Chef", myPerson: false)
]
I edit the question and my arrays are @Published already. Should I chance peopleData directly or I am doing mistake another where.
import SwiftUI
struct ContentView: View {
@StateObject var model = Model()
var body: some View {
VStack {
VStack {
ForEach(model.myPeople) { person in
VStack(alignment: .leading){
Text("Name: \(person.name)")
Text("Age: \(person.age)")
Text("Age: \(person.job)")
}.padding()
}
}
VStack {
ForEach(model.people) { person in
VStack(alignment: .leading){
Text("Name: \(person.name)")
Text("Age: \(person.age)")
Text("Age: \(person.job)")
}.padding()
}
}
Button("Click") {
// In this part i am tryn to use.
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
This is my SwiftUI view but I can't understand which section I am gonna use sorry about that.
Should I add all class and structs in this view ?
Sorry about that I am kind of new on swift and can't find good resource anywhere. I checked documentations too but I understand nothing.
CodePudding user response:
here is my test code that shows doing model.people[0].myPerson.toggle() in the Button
does work. I have made some minor mods and added some comments to the code.
I suggest again, read the very basics of Swift, in particular the array section at: https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html. Without understanding these very basic concepts you will keep struggling to code your App.
Note, there is probably no need for the myPeople array in your Model, but if that's what you want to have.
struct Person: Identifiable{
let id = UUID()
var name: String
var age: Int
var job: String
var myPerson: Bool
}
class Model: ObservableObject {
@Published var people: [Person] = []
@Published var myPeople: [Person] = []
init(){
addPeople()
}
// completely useless
func addPeople(){
people = peopleData
myPeople = peopleData.filter { $0.myPerson }
}
// here inside the class and using `Person` not `person`
var peopleData = [
Person(name: "Bob", age: 22, job: "Student", myPerson: false),
Person(name: "John", age: 26, job: "Chef", myPerson: false)
]
}
struct ContentView: View {
@StateObject var model = Model()
var body: some View {
VStack {
VStack {
// this `myPeople` array is empty at first, nothing is displayed
ForEach(model.myPeople) { person in
VStack(alignment: .leading){
Text("Name: \(person.name)").foregroundColor(.blue)
Text("Age: \(person.age)").foregroundColor(.blue)
Text("Job: \(person.job)").foregroundColor(.blue)
Text("myPerson: " String(person.myPerson)).foregroundColor(.blue)
}.padding()
}
}
VStack {
// this `people` array has two items in it
ForEach(model.people) { person in
VStack(alignment: .leading){
Text("Name: \(person.name)").foregroundColor(.red)
Text("Age: \(person.age)").foregroundColor(.red)
Text("Job: \(person.job)").foregroundColor(.red)
Text("myPerson: " String(person.myPerson)).foregroundColor(.red)
}.padding()
}
}
Button("Click") {
print("\n--> before name: \(model.people[0].name) ")
print("--> before myPerson: \(model.people[0].myPerson) ")
model.people[0].name = "Franz"
model.people[0].myPerson.toggle()
print("\n--> after name: \(model.people[0].name) ")
print("--> after myPerson: \(model.people[0].myPerson) ")
// update the myPeople array (the blue items)
model.myPeople = model.people.filter { $0.myPerson }
}
}
}
}
Alternatively, you could use this code using only one array of people: [Person]:
class Model: ObservableObject {
@Published var people: [Person] = []
init(){
addPeople()
}
func addPeople() {
people = peopleData
}
// here inside the class and using `Person` not `person`
var peopleData = [
Person(name: "Bob", age: 22, job: "Student", myPerson: false),
Person(name: "John", age: 26, job: "Chef", myPerson: false)
]
}
struct ContentView: View {
@StateObject var model = Model()
var body: some View {
VStack {
VStack {
// here filter on myPerson=true
ForEach(model.people.filter { $0.myPerson }) { person in
VStack(alignment: .leading){
Text("Name: \(person.name)").foregroundColor(.blue)
Text("Age: \(person.age)").foregroundColor(.blue)
Text("Job: \(person.job)").foregroundColor(.blue)
Text("myPerson: " String(person.myPerson)).foregroundColor(.blue)
}.padding()
}
}
VStack {
// here filter on myPerson=false
ForEach(model.people.filter { !$0.myPerson }) { person in
VStack(alignment: .leading){
Text("Name: \(person.name)").foregroundColor(.red)
Text("Age: \(person.age)").foregroundColor(.red)
Text("Job: \(person.job)").foregroundColor(.red)
Text("myPerson: " String(person.myPerson)).foregroundColor(.red)
}.padding()
}
}
Button("Click") {
model.people[0].name = "Franz"
model.people[0].myPerson.toggle()
}
}
}
}
