Swift 4中的可选闭包

4
我可以帮您进行翻译。以下是翻译的结果:

我需要一个可按需执行的闭包方法。

在 Swift 3 中,我通常会这样做:

// Declare closure
var checksPerformed: ((Void) -> Void)? // Declaration

// Call when needed
checksPerformed?() 

//Only executes when checksPerformed is called
checksPerformed = { _ in 
    // do stuff here
}

在Swift 4中不再是这种情况。

enter image description here

在解决了这个警告之后,一切都不像以前那样工作了。 现在有什么新的做法吗?
如果我将声明更新为:var checksPerformed: (() -> ())?,我会得到

enter image description here


只需将其更新为:var checksPerformed: (() -> Void)?var checksPerformed: (() -> ())? 两种方式都可以。个人而言,我避免使用 Void,而是在适当的情况下使用 () - oyalhi
变量 checksPerformed: (() -> ())? // 声明 - Nazmul Hasan
@oyalhi 我更新了问题。 - kernelpanic
1
@oyalhi 共识是仅在返回值时使用 Void - Sulthan
1
请查看此帖子 - OOPer
是的,您必须删除下划线。请参见以下答案。 - HixField
2个回答

6

区分单元素元组和多参数函数类型

// Declare closure
var checksPerformed: (() -> ())? // Declaration

// Call when needed
checksPerformed?()

//Only executes when checksPerformed is called
checksPerformed = {
    // do stuff here
}

0

使用

var checksPerformed: (()->(Void))?

如果你这样做,一切都应该按预期工作。

在分配闭包时不要使用下划线:

//Only executes when checksPerformed is called
checksPerformed = { 
    // do stuff here
}

//Call when needed
checksPerformed?() 

你必须这样做 (()->(Void))? 这将它声明为可选的闭包;抱歉,在我之前的回答中,问号是问题句子的一部分。 - HixField
更新了答案以使其更清晰。 - HixField
你的回答与我问题下面的评论相同。但它仍然不起作用(请查看我的更新答案和截图)。 - kernelpanic
@kernelpanic 移除 _ in。这里没有参数。你知道 _ 是一个参数的占位符吗?在你原来的代码中,实际上有一个类型为 Void 的带有一个参数的闭包,而不是没有参数的闭包。 - Sulthan
确保在调用闭包之前先对其进行赋值。代码中顺序是错误的。 - HixField
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接