2016-01-21 54 views
3

下面是代码:如何在if条件中使用尾随封闭?

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

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

Consecutive statements must be separated by a new line

回答

6

你必须把周围的函数调用括号:

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

在第二个代码块中,当调用该函数时,您忘记了参数'caseFolding'的名称。目前它不编译 –

+1

谢谢,纠正。 – Clashsoft

+0

太棒了,这是一个非常全面的答案:+1 –

1

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

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

否则==运营商优先,Compiler将评估它作为

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

这是不合法的代码。