比较时间以从数据中获取活动时间
Compare Times to get active time from data
Simulator Screenshot
在上面的示例中,我有一个数据模型,其中包含将要显示的行程的不同时间。我想用实心圆圈突出显示当前时间:
struct SampleModel: Identifiable {
let id = UUID()
let title: String
let description: String
let time: Date
let icon: String
}
让timeInterval = 1652619600
class Sample: ObservableObject {
@Published var sample2 = [SampleModel(title: "Coffee", description: "Get coffee", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)), icon: "house"),
SampleModel(title: "Coffee", description: "Get coffee", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 30), icon: "house"),
SampleModel(title: "Dinner", description: "Outback Steakhouse", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 60), icon: "person"),
SampleModel(title: "Check Weather", description: "Use app to check weather", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 120), icon: "cloud.sun.fill"),
SampleModel(title: "Go To Work", description: "Leave for work", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 180), icon: "car.fill"),
SampleModel(title: "YouTube", description: "Watch youtube video", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 240), icon: "video.fill"),
SampleModel(title: "Cut Grass", description: "Work in yard", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 300), icon: "speedometer"),
SampleModel(title: "Ride Bike", description: "Go to the trace", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 360), icon: "bicycle"),
SampleModel(title: "Take Pictures", description: "Photograph the moon", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 420), icon: "camera.fill"),
SampleModel(title: "Boat Ride", description: "Go boating", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 480), icon: "ferry.fill"),
SampleModel(title: "Colorado trip", description: "Fly to Erie", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 540), icon: "airplane")]
func isCurrent(date1: Date) -> Bool {
var currentItem: Bool = false
for cTime in sample2 {
if date1 <= cTime.time && date1 <= Date() {
} else {
currentItem = false
}
}
return currentItem
}
}
上面的数据只是一个示例模拟数据,因此我可以获得 UI 并且功能正常运行。在我的内容视图中,我有。 foreach 在示例数据上循环,我想用实心圆突出显示当前项目。在 isCurrent() 函数中,我可以获得之前已经发生的所有项目,但我想要 return 最近的
ForEach(sampleVM.sample2, id: \.id) { index in
Divider()
ItemRowView(isCurrent: sampleVM.isCurrent(date1: index.time), isLastRow: lastRow(item: index.id), time: Date(), sample: index)
}
ItemRowView()
是我用来显示数据的。
由于数组已排序,您只需找到日期大于当前日期
的第一个item/index
- 如果找不到索引(当前日期晚于最后一项的日期)则该项目是最后一项
- 如果索引为 0(当前日期早于第一项的日期)则该项为
nil
- 否则该项目是索引 - 1 处的项目
let currentItem : SampleModel?
if let nextIndex = sample2.firstIndex(where: {[=10=].time > Date()}) {
currentItem = nextIndex > 0 ? sample2[nextIndex - 1] : nil
} else {
currentItem = sample2.last!
}
或者如果结果是索引
let currentIndex: Int?
if let nextIndex = sample2.firstIndex(where: {[=11=].time > Date()}) {
currentIndex = nextIndex > 0 ? nextIndex - 1 : nil
} else {
currentIndex = sample2.endIndex - 1
}
Simulator Screenshot
在上面的示例中,我有一个数据模型,其中包含将要显示的行程的不同时间。我想用实心圆圈突出显示当前时间:
struct SampleModel: Identifiable {
let id = UUID()
let title: String
let description: String
let time: Date
let icon: String
}
让timeInterval = 1652619600
class Sample: ObservableObject {
@Published var sample2 = [SampleModel(title: "Coffee", description: "Get coffee", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)), icon: "house"),
SampleModel(title: "Coffee", description: "Get coffee", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 30), icon: "house"),
SampleModel(title: "Dinner", description: "Outback Steakhouse", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 60), icon: "person"),
SampleModel(title: "Check Weather", description: "Use app to check weather", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 120), icon: "cloud.sun.fill"),
SampleModel(title: "Go To Work", description: "Leave for work", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 180), icon: "car.fill"),
SampleModel(title: "YouTube", description: "Watch youtube video", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 240), icon: "video.fill"),
SampleModel(title: "Cut Grass", description: "Work in yard", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 300), icon: "speedometer"),
SampleModel(title: "Ride Bike", description: "Go to the trace", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 360), icon: "bicycle"),
SampleModel(title: "Take Pictures", description: "Photograph the moon", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 420), icon: "camera.fill"),
SampleModel(title: "Boat Ride", description: "Go boating", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 480), icon: "ferry.fill"),
SampleModel(title: "Colorado trip", description: "Fly to Erie", time: Date(timeIntervalSince1970: TimeInterval(timeInterval)).adding(minutes: 540), icon: "airplane")]
func isCurrent(date1: Date) -> Bool {
var currentItem: Bool = false
for cTime in sample2 {
if date1 <= cTime.time && date1 <= Date() {
} else {
currentItem = false
}
}
return currentItem
}
}
上面的数据只是一个示例模拟数据,因此我可以获得 UI 并且功能正常运行。在我的内容视图中,我有。 foreach 在示例数据上循环,我想用实心圆突出显示当前项目。在 isCurrent() 函数中,我可以获得之前已经发生的所有项目,但我想要 return 最近的
ForEach(sampleVM.sample2, id: \.id) { index in
Divider()
ItemRowView(isCurrent: sampleVM.isCurrent(date1: index.time), isLastRow: lastRow(item: index.id), time: Date(), sample: index)
}
ItemRowView()
是我用来显示数据的。
由于数组已排序,您只需找到日期大于当前日期
的第一个item/index- 如果找不到索引(当前日期晚于最后一项的日期)则该项目是最后一项
- 如果索引为 0(当前日期早于第一项的日期)则该项为
nil
- 否则该项目是索引 - 1 处的项目
let currentItem : SampleModel?
if let nextIndex = sample2.firstIndex(where: {[=10=].time > Date()}) {
currentItem = nextIndex > 0 ? sample2[nextIndex - 1] : nil
} else {
currentItem = sample2.last!
}
或者如果结果是索引
let currentIndex: Int?
if let nextIndex = sample2.firstIndex(where: {[=11=].time > Date()}) {
currentIndex = nextIndex > 0 ? nextIndex - 1 : nil
} else {
currentIndex = sample2.endIndex - 1
}