【问题标题】:How to use trailing closure in if condition?如何在 if 条件下使用尾随闭包?
【发布时间】:2016-01-22 01:51:13
【问题描述】:

代码如下:

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")
}

期待得到“这是鲍勃”。但是却得到了错误:

连续的语句必须用新行分隔

【问题讨论】:

    标签: swift


    【解决方案1】:

    你必须在函数调用周围加上括号:

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

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

    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")
    }
    

    【讨论】:

    • 在第二个代码块中,您在调用函数时忘记了参数名称caseFolding。目前无法编译
    【解决方案2】:

    把你的函数调用放在括号之间:

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

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

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

    这是无效的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      相关资源
      最近更新 更多