为什么我生成的函数没有被执行?
Why isn't my generated function being executed?
我有一个注销按钮如下:
struct LogoutButtonView: View {
@EnvironmentObject var state: AppState
@StateObject var viewModel = ViewModel()
var body: some View {
Button("Log Out") { viewModel.isConfirming = true }
.confirmationDialog("Are you that you want to logout",
isPresented: $viewModel.isConfirming) {
Button("Confirm Logout", role: .destructive, action: viewModel.getLogoutAction(state: state))
Button("Cancel", role: .cancel) {}
}
.disabled(state.shouldIndicateActivity)
}
}
其视图模型如下:
extension LogoutButtonView {
class ViewModel: ObservableObject {
@Published var isConfirming = false
func getLogoutAction(state: AppState) -> () -> Void {
print("Inside getLogoutAction")
return {
func logout() {
print("Inside Logout")
state.shouldIndicateActivity = true
// .. Logout Logic
}
}
}
}
}
我需要将全局 AppState
的引用传递给视图模型,这就是我尝试生成注销函数而不是直接将其放入视图模型的原因。
为什么不打印“Inside Logout”? Swift 如何根据 Functional Programming
工作?从本地视图模型 update/access 全局 AppState
的正确方法是什么?
答案是你永远不会打电话给 logout()
。
的确,您 return 按钮点击时的功能,但您没有调用 returned (logout
) 功能。所以它永远不会被执行。
我有一个注销按钮如下:
struct LogoutButtonView: View {
@EnvironmentObject var state: AppState
@StateObject var viewModel = ViewModel()
var body: some View {
Button("Log Out") { viewModel.isConfirming = true }
.confirmationDialog("Are you that you want to logout",
isPresented: $viewModel.isConfirming) {
Button("Confirm Logout", role: .destructive, action: viewModel.getLogoutAction(state: state))
Button("Cancel", role: .cancel) {}
}
.disabled(state.shouldIndicateActivity)
}
}
其视图模型如下:
extension LogoutButtonView {
class ViewModel: ObservableObject {
@Published var isConfirming = false
func getLogoutAction(state: AppState) -> () -> Void {
print("Inside getLogoutAction")
return {
func logout() {
print("Inside Logout")
state.shouldIndicateActivity = true
// .. Logout Logic
}
}
}
}
}
我需要将全局 AppState
的引用传递给视图模型,这就是我尝试生成注销函数而不是直接将其放入视图模型的原因。
为什么不打印“Inside Logout”? Swift 如何根据 Functional Programming
工作?从本地视图模型 update/access 全局 AppState
的正确方法是什么?
答案是你永远不会打电话给 logout()
。
的确,您 return 按钮点击时的功能,但您没有调用 returned (logout
) 功能。所以它永远不会被执行。