问题描述
Toggle("",isOn: Binding (
get: {
isReminderTime
},
set: {
requestNotificationPermission()
}
)) // 提醒时间
在SwiftUI中使用Binding时发现, Binding的set报错:
Contextual type for closure argument list expects 2 arguments, which cannot be implicitly ignored
Insert '_,_ in '
经过查询了解到Binding语法中,set需要接收新值并更新isReminderTime,而这里只调用了一个方法。
解决方案
Toggle("", isOn: Binding(
get: {
isReminderTime
},
set: { newValue in
if newValue {
requestNotificationPermission() // 仅在开启提醒时请求权限
}
isReminderTime = newValue // ✅ 需要正确更新绑定的变量
}
))
设置一个newValue接收新值,更新变量内容,这样Toggle就可以正常工作。
类似问题
在Binding中也常常见到没有newValue的情况,例如:
Slider(value: Binding(
get: { Double(self.score) },
set: { self.score = Int($0) }
), in: 0...100)
在这段代码中,没有使用newValue接收新值,而是通过self.score = Int($0)。
这是因为参数$0是Swift的简写形式,等价于newValue。
在 Swift 闭包中,如果参数列表只有一个参数,你可以省略参数名,直接使用 $0 代表这个参数。
set: { self.score = Int($0) }
等价于:
set: { newValue in
self.score = Int(newValue)
}
其中 $0 代表 Slider 传入的新值。
在前面报错的代码中:
set: {
requestNotificationPermission()
}
这里 set 没有使用 $0 来接收新值,所以编译器报错,因为 set 期望有一个参数传入但忽略了它。