Swift中如何从数组获取原始值而非ArraySlice
解决Swift中从Date数组取值得到ArraySlice而非单个Date的问题
问题根源
你的代码有两个核心错误:
- 循环遍历方式错误:
for i in [1..<cycleStartsArr.count]是把一个Range包装成了数组,导致循环变量i是Range<Int>类型。用Range索引数组时,返回的是ArraySlice<Date>而非单个Date对象,这就是类型不匹配报错的原因。 - Date属性调用错误:
Date类型本身没有day属性,dateComponents方法直接接收Date类型参数即可,无需额外提取day属性。
修正后的代码
var cycleStartsArr: [Date] = [] // 示例:向数组中添加测试日期 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" if let date1 = dateFormatter.date(from: "2024-01-01"), let date2 = dateFormatter.date(from: "2024-01-05"), let date3 = dateFormatter.date(from: "2024-01-10") { cycleStartsArr.append(date1) cycleStartsArr.append(date2) cycleStartsArr.append(date3) } var gaps: [Int] = [] // 直接遍历Int类型的Range,确保i是单个索引值 for i in 1..<cycleStartsArr.count { let startDate = cycleStartsArr[i] let endDate = cycleStartsArr[i-1] // 正确调用dateComponents,直接传入Date对象 let components = Calendar.current.dateComponents([.day], from: endDate, to: startDate) // 安全解包天数间隔,避免nil崩溃 if let dayGap = components.day { gaps.append(dayGap) } } print(gaps) // 输出:[4, 5]
关键说明
- 数组索引规则:Swift数组用单个
Int值索引时返回单个元素,用Range索引才会返回ArraySlice,因此确保循环变量是Int类型是解决问题的核心。 - dateComponents参数顺序:注意
from和to的顺序,若要计算从较早日期到较晚日期的正天数差,需把较早日期放在from位置。 - 可选值处理:
components.day是可选类型,必须安全解包后再存入数组,避免运行时崩溃。
内容的提问来源于stack exchange,提问作者laurie
相关产品推荐
相关产品推荐

