#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)")
}
}