代码如下:
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/