我正在 for each 月的数据日历工作

我因为特殊情况(索引越界)而崩溃

这是我的密码

class ViewController: UIViewController {
    var dateComponents: DateComponents!
    var TimeToday :[String] = []
    var TimeTomorrow :[String] = []
    var TimeYesterday :[String] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        let dateDay = Date()
        let calendar = Calendar(identifier: .gregorian)
        dateComponents = calendar.dateComponents([.day, .month, .year], from: dateDay)
        done()
    }
    func done()  {
        //------ for tomorrow ------
        // month end day 31
        if (dateComponents.day! == 30){
            if(dateComponents.month! == 1 || dateComponents.month! == 4 || dateComponents.month! == 6 || dateComponents.month! == 7 || dateComponents.month! == 9 || dateComponents.month! == 11 ){
                TimeTomorrow.append("\(dateComponents.month!+1)")
            }
        // month end day 31
        }else if (dateComponents.day! == 31){
            if(dateComponents.month! == 3 || dateComponents.month! == 5 || dateComponents.month! == 8 ){
                TimeTomorrow.append("\(dateComponents.month!+1)")
            }else if(dateComponents.month! == 12){
                TimeTomorrow.append("\(dateComponents.year!+1)")
            }
         // month end day 29
        // special case for leap year i donot know how find it
        //****************************************************
            else if (dateComponents.day! == 29){
                if(dateComponents.month! == 2 || dateComponents.month! == 10  ){
                    TimeTomorrow.append("\(dateComponents.month!+1)")
                }
            }
        //------ for yesterday  ------
            if (dateComponents.month! == 12 || dateComponents.month! == 10 || dateComponents.month! == 8 || dateComponents.month! == 7 || dateComponents.month! == 5 || dateComponents.month! == 2){
                var day = dateComponents.date! - 1
                //fatal error: unexpectedly found nil while unwrapping an Optional value
                TimeYesterday.append("\(day)")
                TimeYesterday.append("30 - \(dateComponents.month! - 1)")
            }else {
                //////
            }
        }
    }
}

推荐答案

你应该使用日历方法date(byAdding component:)来使用中午时间进行日历计算.这样你就不必担心那些特殊情况:

Swift 3 or Later

extension Date {
    static var yesterday: Date { return Date().dayBefore }
    static var tomorrow:  Date { return Date().dayAfter }
    var dayBefore: Date {
        return Calendar.current.date(byAdding: .day, value: -1, to: noon)!
    }
    var dayAfter: Date {
        return Calendar.current.date(byAdding: .day, value: 1, to: noon)!
    }
    var noon: Date {
        return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
    var month: Int {
        return Calendar.current.component(.month,  from: self)
    }
    var isLastDayOfMonth: Bool {
        return dayAfter.month != month
    }
}

Date.yesterday    // "Oct 28, 2018 at 12:00 PM"
Date()            // "Oct 29, 2018 at 11:01 AM"
Date.tomorrow     // "Oct 30, 2018 at 12:00 PM"

Date.tomorrow.month   // 10
Date().isLastDayOfMonth  // false

Swift相关问答推荐

通过withstickedContinuation传递通用类型T

如何返回JSON数据?

如何在自定义视图中读取修改符子元素?

查找数组中 ** 元素 ** 的属性的最小值和最大值

在SwiftUI中绘制形状的路径后填充形状

macOS SwiftUI: 如何触发删除一个项目?

在Equatable上引用运算符函数==要求Dictionary.Values符合Equatable

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

deinitialize() 与 deallocate()

闭包 - deinit self 对象的时间

在 Vapor 4 中使用协议的通用流利查询

类型 '()' 不能符合 View (除非它肯定是 View,这次没有恶作剧)

Swift初始化具有可变ID的重复值数组

Swift 读写图片占用大量内存

为什么 swift 中的类没有存储类型属性?

如何从 Button 获取标签名称?

Swift :如何在一组字符之后得到所有东西

如何以编程方式读取 wkwebview 的控制台日志(log)

类型myViewController不符合 Swift 中的协议 UIPIckerDataSource

ISO8601DateFormatter 不解析 ISO 日期字符串