gpt4 book ai didi

swift - 既然已经删除了 C 样式循环,如何在每次迭代中快速创建一个具有动态增量的 for 循环

转载 作者:行者123 更新时间:2023-11-28 08:18:56 25 4
gpt4 key购买 nike

我正在尝试做一些使用 C 风格循环很容易但我在 Swift3 中苦苦挣扎的事情。

我有一个循环,我需要根据存储在数组中的值增加不同的数量。下面的代码更好地描述了它。

let scaleIntervals: [Int] = [2,2,1,2,2,2,1] 
let notes: [String] = ["A", "A#", "B", "C", "C#" "D", "D#" "E", "F" ,"G", "G#"]
var scale: [String] = []

for(var i = 0; i < notes.length; i++){

/* *Sketchy - untested* If the note in the first index of the output array
matches the current note we have completed the scale. Exit loop */

if scale[0] == notes[i]{
break
}

//Add the note to the output array and increment by the next interval

scale.append(notes[i])
i += scaleIntervals![i]

//If interval makes i larger than the notes array, loop back round

if i >= notes.length{
i -= notes.length
}


}

如果您已经读到这里并且认为“代码看起来不太像 swift”,那是因为我目前正在从 JavaScript 过渡到 Swift,并且有些习惯很难改掉。

我正在寻找另一种循环安排,因为 for in 创建 i 作为 let 使其不可变,在增量行抛出错误 i += scaleIntervals![i].我认为 stride 可能会起作用,但我不知道如何设置它。

此外,将 for in where 循环与模运算符一起使用只能在一定程度上起作用,因为我的增量很大,可能会导致误报。话虽这么说,如果我错了,你可以让它发挥作用,我很乐意学习如何做。

我什至会接受完全不同的结构(即非 for 循环)。

最佳答案

这是一个在 scaleIntervals 上使用常规 for-in 循环的更正版本。您还忘记了 F# :-)

let scaleIntervals: [Int] = [2,2,1,2,2,2,1]
let notes: [String] = ["A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"]

func scale(fromNote tonicIndex: Int) -> [String] {
var result: [String] = []

var currentIndex = tonicIndex
for interval in scaleIntervals {
result.append(notes[currentIndex])
currentIndex = (currentIndex + interval) % notes.count
}

return result
}

print(scale(fromNote: 0)) // ["A", "B", "C#", "D", "E", "F#", "G#"]
print(scale(fromNote: 3)) // ["C", "D", "E", "F", "G", "A", "B"]

只是为了好玩,这是一个使用 reduce 的单表达式版本。这对类型检查来说真的很慢,而且效率可能较低,但它很可爱:

func scale(fromNote tonicIndex: Int) -> [String] {
return scaleIntervals.reduce((notes: [], index: 0), {
($0.notes + [notes[$0.index]], ($0.index + $1) % notes.count)
}).notes
}

关于swift - 既然已经删除了 C 样式循环,如何在每次迭代中快速创建一个具有动态增量的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41784584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com