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

既然已经删除了C样式的循环,那么如何在swift中的每次迭代中创建一个具有动态增量的for循环,swift,for-loop,swift3,increment,Swift,For Loop,Swift3,Increment,我正在尝试做一些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 < not

我正在尝试做一些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
    }


}
let scaleIntervals:[Int]=[2,2,1,2,2,2,1]
let notes:[字符串]=[“A”,“A”,“B”,“C”,“C”,“D”,“D”,“E”,“F”,“G”,“G”]
变量比例:[字符串]=[]
对于(变量i=0;i=notes.length{
i-=notes.length
}
}
如果您已经阅读了这么多,并且认为“代码看起来不太像swift”,那是因为我目前正在从JavaScript过渡到swift,一些习惯很难改变

我在寻找另一种循环安排,如
for in
I
创建为
let
使其不可变在增量行
I+=scaleIntervals抛出一个错误![i] 
。我原以为大步走可能行得通,但我不知道该如何设置

另外,使用带有模运算符的
for in-where
循环也只能在某一点上起作用,因为我使其具有可能导致误报的较大增量。尽管如此,如果我错了,你可以让它工作,我很想学习如何


我甚至可以接受一种完全不同的结构(即非for循环)。

这里有一个修正版本,在
尺度区间上使用常规for-in循环。你也忘了F:-)


为了好玩,这里有一个使用
reduce
的单一表达式版本。这是非常缓慢的打字检查,可能效率较低,但它很可爱:

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

下面是一个在
scaleIntervals
上使用常规for-in循环的更正版本。你也忘了F:-)


为了好玩,这里有一个使用
reduce
的单一表达式版本。这是非常缓慢的打字检查,可能效率较低,但它很可爱:

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

我想你的意思是
scale[0]==
而不是
scaleInterval[0]==
?我确实是这么想的。谢谢我简化了我的代码,使问题更易于编写,并把变量名弄得乱七八糟。谢谢你指出这一点。真的很遗憾
序列
上的a
scan(::)
方法
–你可以说
scaleIntervals.lazy.scan(tonicIndex,{($0+$1)%notes.count})。map{notes[$0]}
否则(你仍然可以说,实现它的代码是-但可能值得,也可能不值得).我想你的意思是
scale[0]==
而不是
scaleInterval[0]==
?我确实是这么想的。谢谢我简化了我的代码,使问题更易于编写,并把变量名弄得乱七八糟。谢谢你指出这一点。真的很遗憾
序列
上的a
scan(::)
方法-你可以说
scaleIntervals.lazy.scan(tonicIndex,{($0+$1)%notes.count})。map{notes[$0]}
否则(实际上你仍然可以,实现它的代码是-但可能不值得麻烦)。可怜的F#哈哈。我匆忙地打了那个。非常感谢你。翻转它并使用间隔数组作为我迭代的数组。我没想到。现在我觉得有点傻。哇,你知道你的雨燕!从你的个人资料看,你对数学很感兴趣。音乐和数学有时让我摸不着头脑。我想我已经习惯了以10为基数来计算,以至于我很难让自己的脑袋绕过12段音色的均一气质系统。用你的话来说,Reduce方法很“可爱”,但我现在有点不知所措。我从未在JS中使用过Redux,但我了解了这个概念。不过,这是一个很好的小例子。谢谢是的,我学过音乐和数学:)请记住,你是在对数尺度上工作的:等间隔⟷ 等频率比。半音阶之间的比率是2^(1/12),因此其中12个构成一个八度音阶:(2^(1/12))^12=2。这只是一个无关紧要的关系,但如果你喜欢数学,你可能会发现这很有启发性:我喜欢数学;我只是在挣扎。在大学里有一位糟糕的老师(美国高中水平),这让我有一段时间不喜欢它。我会从这类事情中受益的。网上学习的好地方有什么建议吗?但请记住,我目前的水平相当悲惨我自己还没有尝试过这种数学,但我想这可能是一个很好的起点。可怜的F#哈哈。我匆忙地打了那个。非常感谢你。翻转它并使用间隔数组作为我迭代的数组。我没想到。现在我觉得有点傻。哇,你知道你的雨燕!从你的个人资料看,你对数学很感兴趣。音乐和数学有时让我摸不着头脑。我想我已经习惯了以10为基数来计算,以至于我很难让自己的脑袋绕过12段音色的均一气质系统。用你的话来说,Reduce方法很“可爱”,但我现在有点不知所措。我从未在JS中使用过Redux,但我了解了这个概念。不过,这是一个很好的小例子。谢谢是的,我学过音乐和数学:)请记住,你是在对数尺度上工作的:等间隔⟷ 等频率比。半音阶之间的比率是2^(1/12),因此其中12个构成一个八度音阶:(2^(1/12))^12=2。这只是一个无关紧要的关系,但如果你喜欢数学,你可能会发现这很有启发性:我喜欢数学;我只是在挣扎。在大学里有一位糟糕的老师(美国高中水平),这让我有一段时间不喜欢它。我会从这类事情中受益的。网上学习的好地方有什么建议吗?Ke