SwiftUI — Каков наиболее эффективный способ обновления свойств структуры, у которой слишком много свойств?

#swiftui

Вопрос:

Допустим, у меня есть следующая модель:

Модель

 struct Product {
    var id: Int
    var name: String
    var price: Double
    var property1: String
    var property2: String
    var property3: String
    var property4: String
    var property5: String
    
}
 

И это мое мнение:

Вид

 struct ContentView: View {
    @State var productId = 0
    @State var productName = ""
    @State var productPrice = 0.0
    @State var productProperty1 = ""
    @State var productProperty2 = ""
    @State var productProperty3 = ""
    @State var productProperty4 = ""
    @State var productProperty5 = ""
    
    var product = Product(id: 1, name: "Flour", price: 2.99, property1: "1", property2: "2", property3: "3", property4: "4", property5: "5")
    
    var body: some View {
        VStack {
            Text("Product ID: (productId)")
            Text("Product Name: (productName)")
            Text("Product Price: (productPrice)")
        }
            .onAppear {
                productId = product.id
                productName = product.name
                productPrice = product.price
                productProperty1 = product.property1
                productProperty2 = product.property2
                productProperty3 = product.property3
                productProperty4 = product.property4
                productProperty5 = product.property5
            }
    }
}
 

Это работает, но кажется слишком «неуклюжим» и повторяющимся. Есть ли лучший способ написать этот код?

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

Заранее спасибо!

Комментарии:

1. Да, попробуйте добавить свой собственный » инициал’. Просто не забудьте использовать «Начальное значение» для установки состояний.

2. Привет @aheze! .onAppear-это всего лишь пример. В моем реальном коде я получаю свойства из API и хочу обновить их в представлении, в котором пользователь может изменять продукт. Я пытался объяснить свою проблему самым простым способом, каким только мог. Имеет ли это смысл?

3. Может быть, просто добавьте «@State «перед вашим » продуктом var». Затем просто ссылайтесь на каждое из его свойств в своих представлениях (например,»Текст («Название продукта: (product.ProductName))») и избавьтесь от всех остальных состояний.

Ответ №1:

Похоже, вы создаете @State буквы s, чтобы иметь Binding к ним доступ.

Что вы можете сделать, так это создать product @State переменную, а затем вы сможете получить доступ к привязкам с помощью product подобных:

 product.name // String: regular name
$product.name // Binding<String>: binding to name
 

Новый код:

 struct ContentView: View {
    @State private var product = Product(
        id: 1,
        name: "Flour",
        price: 2.99,
        property1: "1",
        property2: "2",
        property3: "3",
        property4: "4",
        property5: "5"
    )

    var body: some View {
        VStack {
            Text("Product ID: (product.id)")
            Text("Product Name: (product.name)")
            Text("Product Price: (product.price)")

            TextField("Product name field", text: $product.name)
        }
    }
}
 

Результат:

Результат

Ответ №2:

Подобный этому:

 struct Product {
    var id: Int
    var name: String
    var price: Double
    var property1: String
    var property2: String
    var property3: String
    var property4: String
    var property5: String 
}
 
struct ContentView: View {

    @State private var product = Product(id: 1, name: "Flour", price: 2.99, property1: "1", property2: "2", property3: "3", property4: "4", property5: "5")
    
    var body: some View {

            Text("Product ID: (product.id)")
            Text("Product Name: (product.name)")
            Text("Product Price: (product.price)")

    }
    
}