在Swift中使用String的enumerateLines函数

时间:2014-08-02 14:35:55

标签: swift

Swift enumerateLines类型的String函数声明如下:

enumerateLines(body: (line: String, inout stop: Bool) -> ())

据我所知,这个声明意味着:" enumerateLines是一个带有闭包的函数body,它传递两个变量linestop,并返回。空隙"

根据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。

1 个答案:

答案 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)
}