问题描述
在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
但是更推荐后者。