Swift:快速创建日期数组

Swift:快速创建日期数组,swift,Swift,我正在使用一个日历,需要根据用户选择创建一个日期数组。我得到一个日期,然后计算整个星期。我目前正在使用for循环来实现这一点,但我相信有更好更快捷的方法来实现。我想使用地图,但我看不到: private func selectWeek(for date: Date) { var week = [Date]() if let startOfWeek = date.startOfWeek { for delta in 0 ... 6 { if

我正在使用一个日历,需要根据用户选择创建一个日期数组。我得到一个
日期
,然后计算整个星期。我目前正在使用for循环来实现这一点,但我相信有更好更快捷的方法来实现。我想使用
地图
,但我看不到:

private func selectWeek(for date: Date) {
    var week = [Date]()

    if let startOfWeek = date.startOfWeek {
        for delta in 0 ... 6 {
            if let date = Calendar.current.date(byAdding: .day, value: delta, to: startOfWeek) {
                week.append(date)
            }
        }
        calendar.selectDates(week)
    }
}

您的方法是正确的,您可以使用
map
,只需在循环将要迭代的范围内调用它即可

private func selectWeek(for date: Date) {
    if let startOfWeek = date.startOfWeek {
        let week = (0...6).compactMap{Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek)}
        calendar.selectDates(week)
    }
}

您的方法是正确的,您可以使用
map
,只需在循环将要迭代的范围内调用它即可

private func selectWeek(for date: Date) {
    if let startOfWeek = date.startOfWeek {
        let week = (0...6).compactMap{Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek)}
        calendar.selectDates(week)
    }
}

你写的很好。如果要使用map语句,可以这样做:

let week: [Date]!
if let startOfWeek = date.startOfWeek {
    week = Array(0...6).map {
         Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek)!
    }
}
if week != nil {
  calendar.selectDates(week)
}

你写的很好。如果要使用map语句,可以这样做:

let week: [Date]!
if let startOfWeek = date.startOfWeek {
    week = Array(0...6).map {
         Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek)!
    }
}
if week != nil {
  calendar.selectDates(week)
}
那么:

if let startOfWeek = date.startOfWeek {
    let week = (0...6).compactMap { Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek) }
    calendar.selectDates(week)
}
您可以直接在范围上使用
map
(或此处
compactMap
)来防止非零测试。

关于:

if let startOfWeek = date.startOfWeek {
    let week = (0...6).compactMap { Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek) }
    calendar.selectDates(week)
}

您可以直接在范围上使用
map
(或此处
compactMap
来防止非零测试)。

Array(0…6)
那是我丢失的片段!:-)你不需要一个
数组
,你可以映射范围
0…6
@gmoraleda更新了我的答案,只需使用
compactMap
而不是
map
即可去除
nil
值。@MartinR你说得对,更新了我的答案
数组(0…6)
那是我丢失的部分!:-)您不需要
数组
,您可以映射范围
0…6
@gmoraleda更新了我的答案,只需使用
compactMap
而不是
map
即可去除
nil
值。@MartinR您是对的,更新了我的回答您实际上没有使用
compactMap
的返回值,因此
week
未定义。
compactMap
也缺少其右括号。哎呀!编辑!谢谢…使用compactMap处理
date(通过添加:value:to:)
可能出现的nil结果是个好主意。实际上,您没有使用
compactMap的返回值,因此,
week
未定义。
compactMap
也缺少其右括号。哎呀!编辑!谢谢…使用compactMap处理
date中可能出现的nil结果是个好主意(通过添加:value:to:)