面试题答案
一键面试- 定义用户数据结构体:
struct User { let name: String let age: Int }
- 创建SwiftUI视图:
import SwiftUI struct UserView: View { let user: User var body: some View { VStack { Text("Name: \(user.name)") Text("Age: \(user.age)") } } }
- 在预览中绑定真实用户数据结构体并展示:
#Preview { let sampleUser = User(name: "John Doe", age: 30) return UserView(user: sampleUser) }
- 数据发生变化时在预览中实时更新:
- 如果
User
结构体的属性是可变的,可以通过@State
或@Binding
来实现数据变化时视图的更新。但在预览环境中,由于预览是静态的,无法直接像在运行时那样监听实时数据变化。 - 一种变通方法是使用
@ObservableObject
和@ObservedObject
。首先将User
结构体包装在一个符合ObservableObject
协议的类中:
class UserViewModel: ObservableObject { @Published var user: User init(user: User) { self.user = user } }
- 然后修改
UserView
以接受UserViewModel
:
struct UserView: View { @ObservedObject var viewModel: UserViewModel var body: some View { VStack { Text("Name: \(viewModel.user.name)") Text("Age: \(viewModel.user.age)") } } }
- 在预览中,模拟数据变化:
这里通过#Preview { let viewModel = UserViewModel(user: User(name: "John Doe", age: 30)) let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect() return UserView(viewModel: viewModel) .onReceive(timer) { _ in viewModel.user.age += 1 } }
Timer
定时修改User
的age
属性,从而在预览中模拟数据变化并实时更新视图。不过需要注意,这种方法主要用于展示数据变化效果,实际应用中的数据变化监听会基于真实的业务逻辑和数据来源。 - 如果