Swift enumerateLines
类型的String
函数声明如下:
enumerateLines(body: (line: String, inout stop: Bool) -> ())
据我所知,这个声明意味着:" enumerateLines是一个带有闭包的函数body
,它传递两个变量line
和stop
,并返回。空隙"
根据Swift Programming Language book,我相信我应该能够用一个简单的简洁方式调用enumerateLines
,并使用尾随闭包,如下所示:
var someString = "Hello"
someString.enumerateLines()
{
// Do something with the line here
}
..但这会导致编译错误:
Tuple types '(line: String, inout stop: Bool)' and '()' have a different number of elements (2 vs. 0)
然后我尝试显式地放入参数,并取消尾随闭包:
addressString.enumerateLines((line: String, stop: Bool)
{
// Do something with the line here
})
...但这会导致错误:
'(() -> () -> $T2) -> $T3' is not identical to '(line: String.Type, stop: Bool.Type)'
简而言之,我尝试的语法没有产生任何可以成功编译的语法。
有人能指出我的理解中的错误并提供一个可行的语法吗?我正在使用Xcode 6 Beta 4。
答案 0 :(得分:12)
closure expression syntax具有一般形式
{ (parameters) -> return type in
statements
}
在这种情况下:
addressString.enumerateLines ({
(line: String, inout stop: Bool) -> () in
println(line)
})
或者,使用尾随闭包语法:
addressString.enumerateLines {
(line: String, inout stop: Bool) in
println(line)
}
由于自动类型推断,这可以缩短为
addressString.enumerateLines {
line, stop in
println(line)
}
Swift 3的更新:
addressString.enumerateLines { (line, stop) in
print(line)
// Optionally:
if someCondition { stop = true }
}
或者,如果你不需要"停止"参数:
addressString.enumerateLines { (line, _) in
print(line)
}