swift - 如何在 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")
}

期待得到“It's bob”。而是得到了错误:

Consecutive statements must be separated by a new line

最佳答案

您必须在函数调用两边加上括号:

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 语句“声明”了 {} block ,即它不属于 lastNameForPerson 再打电话。对于编译器,第二个代码块现在看起来像一个没有与之前的 (if) 语句正确分离的普通 block 。


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

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

关于swift - 如何在 if 条件下使用尾随闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34930596/

相关文章:

ios - 我的模板/通用 Swift 初始化程序/构造函数有什么问题?

IOS 13 UIWindow 实例在应用程序启动期间为零

ios - 多个导航栏

swift - 如何调用IOCFPlugInInterface.QueryInterface()查询USB设备

ios - 搜索栏 Controller iOS 11 问题 - 搜索栏和范围按钮重叠

iOS 使用 presentModalSegue 将数据从 viewController2 传回给 viewController 1

swift - 使用真实世界方位在 ARKit 场景中定向 SCNNode

ios - 无法设置 MBProgressHUD 模式来确定

ios - 为什么 Swift 不将此 Int 数组文字转换为正确的类型?

ios - 将 Facebook 数据传输到 Firebase