我想要做的是通过逐个附加到另一个数组(availableExercises)的元素来填充数组(序列)。我想一个接一个地做,因为序列必须保持给定数量的项目。可用的练习列表本质上是有限的,我希望尽可能多地使用它的元素,而不是可用列表总数的多个。
包含的当前代码完全正确并且有效。可以将其粘贴到Playground中以便在工作中查看它。
我的问题是:是否有更好的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
答案 0 :(得分:2)
您可以像i
那样使用模sequence.count % availableExercises.count
来克服。{/ p>
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"]
答案 1 :(得分:1)
您可以使用map(_:)
和remainder operator %
缩小逻辑:
let sequence = (0..<totalSessions).map {
availableExercises[$0 % availableExercises.count]
}
map(_:)
将从0
迭代到(但不包括)totalSessions
,对于每个索引,availableExercises
中的相应元素将用于结果中,与余数运算符允许您环绕&#39;一旦到达availableExercises
的末尾。
这也有一个优点,就是预先分配结果数组(map(_:)
会为你做的),防止在附加时不必要地重新分配它。
答案 2 :(得分:1)
就个人而言,Nirav的解决方案可能是最好的,但我无法提供这种解决方案,特别是因为它在Swift中展示了(伪)无限懒惰序列:
Array(
repeatElement(availableExercises, count: .max)
.joined()
.prefix(totalSessions))
如果你只想迭代这个,你当然不需要Array()
,你可以让整个事情变得懒散。在Array()
中将其包装起来只是强制它立即评估(&#34;严格来说&#34;)并避免疯狂的BidirectionalSlice<FlattenBidirectionalCollection<Repeated<Array<String>>>>
类型。