2017-02-16 3 views
1

私がしたいことは、別の配列(availableExercises)の要素を1つずつ追加して配列(配列)に値を設定することです。私はシーケンスが与えられた数のアイテムを保持しなければならないので、1つずつ実行したい。利用可能なエクササイズリストは本質的に有限であり、複数の利用可能なリストの合計ではなく、必要な回数だけその要素を使用したいと考えています。これはSwift3のようなものですか?

含まれている現在のコードは正確に動作し、動作します。それを職場で見るためにプレイグラウンドに貼り付けることは可能です。

私の質問は同じ結果を得るためのより良いSwift3方法はありますか?コードは動作しますが、変数iは必要ありません。 Swift3はクロージャのような構造化されたコードを可能にし、私はそれらをより良く使う方法を見逃しています。私には、現時点で手の届かない、より良い構造があるようです。

import UIKit 
let repTime = 20 //seconds 
let restTime = 10 //seconds 
let woDuration = 3 //minutes 
let totalWOTime = woDuration * 60 
let sessionTime = repTime + restTime 

let totalSessions = totalWOTime/sessionTime 

let availableExercises = ["push up","deep squat","burpee","HHSA plank"] 


var sequence = [String]() 
var i = 0 
while sequence.count < totalSessions { 

    if i < availableExercises.count { 
     sequence.append(availableExercises[i]) 
     i += 1 
    } 
    else { i = 0 } 
} 

sequence 

答えて

1

あなたがmap(_:)remainder operator%を使用してロジックを凝縮することができます

let sequence = (0..<totalSessions).map { 
    availableExercises[$0 % availableExercises.count] 
} 

​​まで0から反復(は含まない)だろうtotalSessions、および各インデックスについて、対応する要素でavailableExercisesが結果に使用され、残りの演算子はavailableExercisesの末尾に達すると「回り込む」ことができます。

これはまた、結果の配列(​​があなたのために行う)を事前に割り当てる利点があり、追加時に不必要に再割り当てされないようにします。

+0

Thxたくさん!これはまさに私が考えていたものです。機能的なプログラミングスタイルの構造:)私はこのような考え方で多くの問題を抱えてきました...私は閉鎖にかなり新しいです。 –

2

あなたがこの方法のようsequence.count % availableExercises.countの剰余を使用してiから克服することができます:

は、ここでは、コードです。

var sequence = [String]() 
while(sequence.count < totalSessions) { 
    let currentIndex = sequence.count % availableExercises.count 
    sequence.append(availableExercises[currentIndex]) 
} 
print(sequence) 
//["push up", "deep squat", "burpee", "HHSA plank", "push up", "deep squat"] 
+0

%演算子は、私が常に忘れているものです。 –

1

個人的には、Niravのソリューションは、おそらく最高のですが、私はそれがスウィフト中(擬似)無限の怠惰なシーケンスを示して特にため、このソリューションを提供して助けることができない:あなただけの反復処理したい場合は

Array(
    repeatElement(availableExercises, count: .max) 
     .joined() 
     .prefix(totalSessions)) 

をこの上に、あなたはもちろんArray()を必要としません、あなたはすべてのことを怠惰なままにすることができます。それをArray()に入れるだけで、即座に(厳密に)評価され、狂ったBidirectionalSlice<FlattenBidirectionalCollection<Repeated<Array<String>>>>タイプは避けられます。

+1

うわー、これはいいですね。 – Alexander

関連する問題