我理解如何使用swift语法编写for循环(使用.enumerate()和.revers()),但是我如何重写(在swift中)以下javascript版本的for循环,考虑到我有多个要遵守的条件:
for(var j = 10; j >= 0 && array[j] > value; j--) {
array[j + 1] = array[j];
}
答案 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]
}
}