swift - 在 Swift 中使用 String 的 enumerateLines 函数

标签 swift

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

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

据我了解,此声明的意思是:“enumerateLines 是一个采用闭包 body 的函数,它被传递给两个变量,linestop,并返回 void。”

根据Swift Programming Language book ,我相信我应该能够以一种简洁的方式调用 enumerateLines 并带有尾随闭包,如下所示:

var someString = "Hello"

someString.enumerateLines()
{
    // Do something with the line here
}

..但这会导致编译器错误:

元组类型“(line: String, inout stop: Bool)”和“()”具有不同数量的元素(2 对 0)

然后我尝试显式地放入参数,并取消尾随闭包:

addressString.enumerateLines((line: String, stop: Bool)
{
    // Do something with the line here
})

...但这会导致错误:

'(() -> () -> $T2) -> $T3' 与 '(line: String.Type, stop: Bool.Type)' 不相同

简而言之,我尝试过的任何语法都没有产生任何可以成功编译的结果。

有人能指出我理解中的错误并提供一个可行的语法吗?我正在使用 Xcode 6 Beta 4。

最佳答案

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

或者,如果您不需要“stop”参数:

addressString.enumerateLines { (line, _) in
    print(line)
}

关于swift - 在 Swift 中使用 String 的 enumerateLines 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25096128/

相关文章:

swift - array.last 和一般嵌套数组复制/访问突变混淆

ios - 从 Swift 回调中返回对象

swift - 在一个 UILabel 中显示分数

ios - watchOS 7 不再更新并发症

ios - 在 Swift 中调用 Slack Webincoming 钩子(Hook)但得到 "interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"

swift - 循环遍历数组的范围

ios - 自定义 UIView addTarget 或 RxCocoa 订阅中的 UIButton 不起作用

ios - 部分标题的UITableView自定义 View (内存泄漏)。什么是使节的标题自定义 View 正确的方法?

ios - 为什么我的代码只能在 DispatchQueue.main.async block 内运行?

ios - 将 GMT 时间添加到 ios 中的给定日期时间(来自服务器)