【问题标题】:Accessing element of an array with iterator instead of position in Swift使用迭代器而不是 Swift 中的位置访问数组的元素
【发布时间】:2014-12-05 10:53:38
【问题描述】:

我想知道 Swift 中是否有数组的迭代器,就像在 CPP 中一样,它允许避免使用 position 来访问数组的下一个元素。

实际上,我在数组中使用 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)

})

我正在寻找这样的解决方案:

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)

})

有什么建议吗?

【问题讨论】:

    标签: arrays swift iterator iteration


    【解决方案1】:

    你想要的是使用生成器:

    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()!
        ...
      }
    }
    

    【讨论】:

    • 谢谢,我真的很喜欢这样的东西!
    【解决方案2】:

    -我可以想到一个可以在这里实现的工作,它使用map function of Array

    迭代每个元素:

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

    输出:

    2 3 4 5 6

    -所以这样就可以实现对SwiftArray的每个元素的迭代

    【讨论】:

    • 写这个的惯用方式是arr.forEach { print($0) },因为它不像map()那样构造另一个数组。
    猜你喜欢
    • 2018-08-16
    • 2012-10-08
    • 2016-07-17
    • 2013-11-23
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多