循环

时间:2016-11-13 18:31:41

标签: swift for-loop swift3

我理解如何使用swift语法编写for循环(使用.enumerate()和.revers()),但是我如何重写(在swift中)以下javascript版本的for循环,考虑到我有多个要遵守的条件:

for(var j = 10; j >= 0 && array[j] > value; j--) {
    array[j + 1] = array[j];
}   

3 个答案:

答案 0 :(得分:2)

这个怎么样?

for j in (0...10).reversed() {
    guard array[j] > value else { break }
    array[j + 1] = array[j]
}

答案 1 :(得分:2)

我不确定产生完全相同的结果,但这是Swift 3中的一种方法

for j in stride(from:10, through:0, by: -1) {
   if array[j] <= value { break }
   array[j + 1] = array[j]
}

答案 2 :(得分:0)

为了完成(我个人更喜欢使用for循环检查早期break,正如其他人已经建议的那样) - 在Swift 3.1中你可以使用{{3为了得到数组满足给定谓词的数组索引的后缀。

var array = [2, 3, 6, 19, 20, 45, 100, 125, 7, 9, 21, 22]

let value = 6

for i in array.indices // the array's indices.
    .dropLast() // exclude the last index as we'll be accessing index + 1 in the loop.
    .reversed() // reversed so we can get the suffix that meets the predicate.
    .prefix(while: {array[$0] > value}) // the subsequence from the start of the 
{                                       // collection where elements meet the predicate.
    array[i + 1] = array[i]
}

print(array) // [2, 3, 6, 19, 19, 20, 45, 100, 125, 7, 9, 21]

这假设您正在寻找开始迭代数组的倒数第二个索引。如果你想从特定的索引开始,你可以说:

for i in (0...10).reversed().prefix(while: {array[$0] > value}) {
    array[i + 1] = array[i]
}

这将从索引10开始并向下迭代到0,为您提供与问题中的代码相同的行为。

值得注意的是,上述两种变体都将首先遍历反向索引(直到谓词未被满足),然后通过数组元素。虽然,在Swift 3.1中,有一个prefix(while:)版本可以在一个惰性序列上运行 - 它只允许通过元素进行一次迭代,直到不满足谓词。

在Swift 3.1之前,您可以使用以下扩展程序在prefix(while:)上获取Collection

extension Collection {
    func prefix(while predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.SubSequence {

        var index = startIndex

        while try index < endIndex && predicate(self[index]) {
            formIndex(after: &index)
        }
        return self[startIndex..<index]
    }
}