在Swift中,使用迭代器而不是位置访问数组元素

8
我想知道在Swift中是否有数组迭代器,就像CPP一样,可以避免使用“位置”来访问数组的下一个元素。
实际上,我使用“position + 1”来访问数组的下一个元素:
var array = ["a", "b", "c", "d"]

func arrayToString(success : String -> Void)
{
    var str = String()

    var myFunc : (Int -> Void)!

    myFunc = {

        if $0 < array.count
        {
            str += array[$0]

            myFunc($0 + 1)
        }
        else
        {
            success(str)
        }
    }

    myFunc(0)
}

arrayToString({

    println($0)

})

I'm looking for a solution usable like this:

var array = ["a", "b", "c", "d"]

func arrayToString(success : String -> Void)
{
    var str = String()

    var myFunc : (Iterator -> Void)!

    myFunc = {

        if $0 != nil
        {
            str += array[$0]

            myFunc($0.next)
        }
        else
        {
            success(str)
        }
    }

    myFunc(array.first)
}

arrayToString({

    println($0)

})

有什么建议吗?
2个回答

9
您想要使用的是生成器:
var array = ["a", "b", "c", "d"]
var g = array.generate()
var str = String()
for (var i = g.next(); i != nil; i = g.next()) {
  str += i!
}

这在解析命令行参数时非常方便:
var args = Process.arguments.generate()
while let arg = args.next() {
  if (arg == "--output") {
    let output = args.next()!
    ...
  }
}

在Swift 3中,它现在变成了:
var args = Process.arguments.makeIterator()
while let arg = args.next() {
  if (arg == "--output") {
    let output = args.next()!
    ...
  }
}

谢谢,我真的很需要像这样的东西! - Jean Lebrument

2

- 我可以想到一种解决方法,就是使用Arraymap函数来实现。

对每个元素进行迭代:

let arr = [1, 2, 3, 4, 5]
arr.map { a in print("\(a + 1) ") }

输出:

2 3 4 5 6

- 这样可以在 Swift 中实现对 Array 的每个元素进行迭代。


编写此代码的惯用方式是 arr.forEach { print($0) },因为它不像 map() 一样构造另一个数组。 - Patrick Beard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接