Xcode闭包报错:Function types cannot have argument labels; use ‘_’ before ‘judge’
Xcode闭包报错:Function types cannot have argument labels; use ‘_’ before ‘judge’

Xcode闭包报错:Function types cannot have argument labels; use ‘_’ before ‘judge’

问题描述

在Xcode中,我想要从外部视图给内部视图传递闭包时,添加一个可以控制的Bool变量,当内部视图修改时,外部视图可以跟随改变。

闭包原来的格式为:

var removal: (() -> Void)? = nil

因此,我尝试给闭包添加一个名为isRemove的Bool参数,以实现传递和修改Bool值。

当我修改为下述代码时,Xcode报错:

var removal: ((var isRemove: Bool) -> Void)? = nil

Xcode报错代码为:

Function types cannot have argument labels; use '_' before 'var'
Replace 'var' with '_'

并提示移除var改为_:

var removal: ((_ isRemove: Bool) -> Void)? = nil

外部视图传递的闭包提示:

Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
Insert 'isRemove in '

然后调整Sheet视图的尾随闭包:

CardView(card: cards[index]) {isRemove in
    withAnimation {
        removeCard(at: index,isRemove)
    }
}

问题原因

虽然上面的代码能够实现Bool变量的传递,但是Swift 在闭包类型声明中不直接支持参数标签,只能写参数类型:

var removal: ((_ isRemove: Bool) -> Void)? = nil

在 Swift 中,闭包类型声明的正确写法是这样的

var removal: ((Bool) -> Void)? = nil

CardView 内部触发 removal:

if abs(offset.width) > 100 {
    removal?(offset.width > 0)
}

这里的 offset.width > 0 表示右滑,传递 true;左滑传递 false。

在外部视图ContentView中传递闭包和前面提及的一样,都是在闭包中添加一个变量控制Bool变量,例如下面的isRemove。

CardView(card: cards[index]) { isRemove in
    withAnimation {
        removeCard(at: index, isRemove)
    }
}

总结

在闭包中添加变量时,下面的两种方法是等价的:

var removal: ((_ isRemove: Bool) -> Void)? = nil
var removal: ((Bool) -> Void)? = nil

但是更推荐后者。

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

发表回复

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