Swift:如果let语句条件,则不能使用数组过滤器

jim*_*251 4 swift swift2

假设我有一组用户名

let users = ["Hello", "1212", "12", "Bob", "Rob"]
Run Code Online (Sandbox Code Playgroud)

我想得到名字长度为2的第一个用户,所以我过滤了数组并获得了第一个用户

if let selected = users.filter{$0.characters.count == 2}.first {
   print(selected)
}
Run Code Online (Sandbox Code Playgroud)

此代码在swift 2.2下抛出了编译错误

Consecutive statements on a line must be separated by ';'

但是,这工作正常

let selected = users.filter{$0.characters.count == 2}.first
if let selected = selected {
   print(selected)
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么我需要先将过滤结果存储在一个单独的变量中?任何帮助将非常感激.

vac*_*ama 18

您可以通过在要传递给的闭包周围放置括号来完成此工作filter:

if let selected = users.filter({$0.characters.count == 2}).first {
    print(selected)
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法.有时候在具有额外元素的行上,尾随闭包语法不能很好地工作.您还可以在整个语句周围加上括号:

if let selected = (users.filter {$0.characters.count == 2}.first) {
    print(selected)
}
Run Code Online (Sandbox Code Playgroud)

Swift在解析你的语句时遇到了麻烦.括号在如何解析行方面给出了帮助.你应该更喜欢第一种方式,因为闭包确实是一个参数filter,因此将它括在括号中使得Swift明确表示你将它传递给它filter.