这是代码:
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} {
这不是有效的代码。