如何在 if 条件下使用尾随闭包

  • 本文关键字:闭包 条件下 if swift
  • 更新时间 :
  • 英文 :


这是代码:

class Person {
}
func lastNameForPerson(person: Person, caseFolding: ((String)->(String))? = nil) -> String {
    if let folder = caseFolding {
        return folder("Smith")
    }
    return "Smith"
}
print(lastNameForPerson(Person())) // Prints "Smith"
print(lastNameForPerson(Person()) {$0.uppercaseString}) // Prints "SMITH"
if "SMITH" == lastNameForPerson(Person()) {$0.uppercaseString} {
    print("It's bob")
}

期待得到"这是鲍勃"。但反而得到错误:

连续语句必须用新行分隔

你必须在

函数调用两边加上括号:

if "SMITH" == (lastNameForPerson(Person()) {$0.uppercaseString}) {
    print("It's bob")
}

或者你把它们放在==比较周围(围绕if条件),以 C 风格的方式

if ("SMITH" == lastNameForPerson(Person()) {$0.uppercaseString}) {
    print("It's bob")
}

或者,您可以在参数列表中移动闭包(尽管这需要您显式命名参数):

if "SMITH" == lastNameForPerson(Person(), caseFolding: {$0.uppercaseString}) {
    print("It's bob")
}

出现此问题的原因是 if 语句"声明"{}块,即它不再属于lastNameForPerson调用。对于编译器,第二个代码块现在看起来像一个普通的块,没有与上一个(if)语句正确分离。


一般来说,您可能应该考虑避免使用这样的结构,因为它可能很难阅读(一开始)。相反,您可以将函数调用的结果存储在变量中并进行比较:

let lastName = lastNameForPerson(Person()) {$0.uppercaseString}
if "SMITH" == lastName {
    print("It's bob")
}

将函数调用放在括号之间:

if "SMITH" == (lastNameForPerson(Person()) {$0.uppercaseString}) {

否则,==运算符优先,编译器将其计算为

if ("SMITH" == lastNameForPerson(Person())) {$0.uppercaseString} {

这不是有效的代码。

最新更新