Swift 这能比这更快吗?

Swift 这能比这更快吗?,swift,Swift,我要做的是通过逐个追加另一个数组(availableExercises)的元素来填充数组(序列)。我想一个接一个地做,因为序列必须包含给定数量的项。“可用练习”列表本质上是有限的,我希望尽可能多地使用它的元素,而不是使用可用列表总数的倍数 当前包含的代码正是这样做的,并且有效。可以将其粘贴在操场上,以便在工作时看到 我的问题是:有没有更好的快捷方式来达到同样的效果?虽然代码可以工作,但我不希望使用变量I。Swift3允许像闭包这样的结构化代码,但我不知道如何更好地使用它们。在我看来,似乎会有一个

我要做的是通过逐个追加另一个数组(availableExercises)的元素来填充数组(序列)。我想一个接一个地做,因为序列必须包含给定数量的项。“可用练习”列表本质上是有限的,我希望尽可能多地使用它的元素,而不是使用可用列表总数的倍数

当前包含的代码正是这样做的,并且有效。可以将其粘贴在操场上,以便在工作时看到

我的问题是:有没有更好的快捷方式来达到同样的效果?虽然代码可以工作,但我不希望使用变量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
导入UIKit
让repTime=20//s
让restTime=10//s
让woDuration=3//分钟
让totalWOTime=woDuration*60
让sessionTime=repTime+restime
让totalSessions=totalWOTime/sessionTime
let availableExercises=[“俯卧撑”、“深蹲”、“burpee”、“HHSA平板运动”]
变量序列=[String]()
变量i=0
而sequence.count
您可以使用序列的模来克服
i
中的问题。可用计数%exercises.count如下所示

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"]
var序列=[String]()
while(sequence.count
您可以使用序列的模来克服
i
中的问题。可用计数%exercises.count如下所示

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"]
var序列=[String]()
while(sequence.count
您可以使用和压缩逻辑
%

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

let sequence=(0..您可以使用和
%
压缩逻辑:

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

let sequence=(0..就个人而言,Nirav的解决方案可能是最好的,但我忍不住提供了这个解决方案,特别是因为它在Swift中演示了(伪)无限惰性序列:

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

如果您只想重复这个过程,当然不需要
Array()
,您可以让整个过程保持懒散。将它包装在
Array()
中,只需强制它立即求值(“严格地”)并且避免了疯狂的双向Slice类型。

就个人而言,Nirav的解决方案可能是最好的,但我还是忍不住提供了这个解决方案,特别是因为它在Swift中演示了(伪)无限惰性序列:

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

如果您只想重复这个过程,当然不需要
Array()
,您可以让整个过程保持懒散。将它包装在
Array()
中,只需强制它立即求值(“严格地”)避免了疯狂的
BidirectionalSlice
类型。

Woah,这很好。Woah,这很好。Thx很多!这正是我所想的。函数式编程风格的结构:)我一直很难用这种方式思考…不过我对闭包还是很陌生。Thx很多!这正是我所想的。函数式编程风格的结构:)我一直很难用这种方式思考。。。不过,我对闭包非常陌生。使用%运算符是我经常忘记的:)使用%运算符是我经常忘记的:)