假设我有一组用户名
let users = ["Hello", "1212", "12", "Bob", "Rob"]
我想得到名字长度为2的第一个用户,所以我过滤了数组并获得了第一个用户
if let selected = users.filter{$0.characters.count == 2}.first {
print(selected)
}
此代码在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)
}
任何人都可以解释为什么我需要先将过滤结果存储在单独的变量中?任何帮助都会非常感激。
答案 0 :(得分:13)
你可以通过在你传递给filter
的闭包周围加上括号来完成这项工作:
if let selected = users.filter({$0.characters.count == 2}).first {
print(selected)
}
这是正确的方法。有时候在具有额外元素的行上,尾随闭包语法不能很好地工作。你也可以在整个陈述中加上括号:
if let selected = (users.filter {$0.characters.count == 2}.first) {
print(selected)
}
Swift在解析你的陈述时遇到了麻烦。括号在如何解析行方面给出了帮助。您应该更喜欢第一种方式,因为闭包确实是filter
的参数,因此将其括在括号中会使Swift明确表示您将其传递给filter
。