【问题标题】:function containing 2 loops包含 2 个循环的函数
【发布时间】:2016-03-24 23:41:58
【问题描述】:

这里有一个排序功能,当我将 -- 减量器更改为 -= 1 时,它消除了一个错误,但我仍然得到语法错误。

 func iSortBort(myList: Array) -> Array {

    var extract = myList

    for firstIndex in 0..<extract.count {

        let key = extract[firstIndex]

        for var secondIndex = firstIndex; secondIndex > -1; secondIndex--1 {

【问题讨论】:

  • NOTHING 与它是一个循环中的循环有关。 for var secondIndex = firstIndex; secondIndex &gt; -1; secondIndex--1 这是一个 C 风格的 for 循环。您需要改用for...in
  • 最好在你的问题中保持中立的语气,加入诸如“你的小世界”之类的 cmets 只会进一步降低投票率。

标签: swift swift3


【解决方案1】:

如有疑问,任何 C 风格的 for,无论其位置或嵌套级别如何,都可以轻松更改为 while 循环:

var secondIndex = firstIndex
while secondIndex > -1 {
    defer { i -= 1 }
    // loop body
}

尽管在您的情况下您可能能够摆脱stride。 (不过我不记得如何使用它,尤其是在 Swift 3 中。)

【讨论】:

    【解决方案2】:

    stride 确实是要走的路。此外,您似乎会从使用enumerate() 中受益。试试这个:

    for (firstIndex, key) in extract.enumerate() {
        for secondIndex in firstIndex.stride(through: 0, by: -1) {
            ...
        }
    }
    

    【讨论】:

    • @TokyoToo 不客气!这里的人对初学者可能有点苛刻。不过,并不是每个人都是。只要继续学习,很快你就会发现所有这些东西都很容易。 :)
    • through 替换为to。这可能有点令人困惑,但stride 基本上有两个版本。一个用于&lt;=&gt;= (through),另一个用于&lt;&gt; (to)。见here。因此,您可以将through 替换为to,或者将extract.count 替换为extract.count - 1
    • 顺便说一句,你可以简单地说by: 1而不是by: +1。 :)
    • @TokyoToo 不,你做得不对。现在你有三个循环。去掉外层,也去掉 key 声明,即带有警告的行。那么它应该可以工作了。
    【解决方案3】:

    看看这个:http://bjmiller.me/post/137624096422/on-c-style-for-loops-removed-from-swift-3

    喜欢递减:

    for secondIndex in (0...firstIndex).reverse() {
        print("comparing \(key) and \(myList[secondIndex])")
        if key < extract[secondIndex] {
            extract.removeAtIndex(secondIndex + 1)
            extract.insert(key, atIndex: secondIndex)
        }
    }
    

    【讨论】:

    • 只有-1的情况下真的没有区别。这只是你如何适应它。
    【解决方案4】:

    正确的答案是只使用包含的 Swift sort 函数。这就是你的所有代码,为什么要重新发明轮子? (顺便说一句,您的代码将每个元素与自身进行比较,这是完全没有必要的,它会加载 extract 然后在其中移动元素,当您继续构建数组时会更好。)

    【讨论】:

    • 这并不能解决一般问题,很粗鲁,而且根本没有尝试理解为什么要编写这段代码。
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多