这可以更像Swift3吗?

时间:2017-02-16 11:58:29

标签: swift

我想要做的是通过逐个附加到另一个数组(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

3 个答案:

答案 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>>>>类型。