Xcode报错:Contextual type for closure argument list expects 2 arguments
Xcode报错:Contextual type for closure argument list expects 2 arguments

Xcode报错:Contextual type for closure argument list expects 2 arguments

问题描述

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 期望有一个参数传入但忽略了它。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注