【发布时间】:2021-12-10 04:15:03
【问题描述】:
我试图了解如何使用 reduce 来更改数组中的结构(或类?)。创建 4 个倒数计时器,点击暂停当前计时器并开始下一个计时器。所以我尝试了这样的事情:
var timer1 = CountdownTimer()
// var timer2 = CountdownTimer() etc.
.onTapGesture(perform: {
var timers: [CountdownTimer] = [timer1, timer2, timer3, timer4]
var last = timers.reduce (false) {
(setActive: Bool, nextValue: CountdownTimer) -> Bool in
if (nextValue.isActive) {
nextValue.isActive = false;
return true
} else {
return false
}
}
if (last) {
var timer = timers[0]
timer.isActive = true
}
})
############# CountdownTimer is a struct ######
struct CountdownTimer {
var timeRemaining: CGFloat = 1000
var isActive: Bool = false
}
这不起作用,我看到了两个错误
- 数组中的计时器是计时器的副本,而不是实际计时器,因此更改它们实际上不会更改屏幕上显示的计时器。
- nextValue(即下一个计时器)无法更改,因为它是 reduce 声明中的 let 变量。我不知道如何更改它(或者它是否相关,因为它可能是计时器副本的副本,而不是我真正想要更改的那个)。
我是否以一种对 Swift 来说惯用错误的方式来处理这个问题?我应该如何更改原来的计时器?
【问题讨论】:
-
在 SwiftUI 中将模型与视图正确分离很重要。程序代码属于您的模型。您的视图只是显示模型并调用模型中的方法以响应用户交互。您可能希望您的计时器对象是引用类型(类而不是结构),因为您希望它们是可变的。