Swift3 在Swift 3.0中查找时间错误

Swift3 在Swift 3.0中查找时间错误,swift3,Swift3,在将代码转换为Swift 3.0后,我只剩下一个错误,即“dateComponents”生成“dateComponents”,而不是预期的文本结果类型“NSDate”,我将在该错误适用的行上添加一个*。*不在实际代码中。 我之前不理解代码,因为它是由一个我不再接触的人编写的。代码为我编写的时间表应用程序设置开始日期 我的代码: @IBOutlet weak var llllll: UILabel! class CyclicDay { enum CyclicDayError: Error

在将代码转换为Swift 3.0后,我只剩下一个错误,即“dateComponents”生成“dateComponents”,而不是预期的文本结果类型“NSDate”,我将在该错误适用的行上添加一个*。*不在实际代码中。 我之前不理解代码,因为它是由一个我不再接触的人编写的。代码为我编写的时间表应用程序设置开始日期

我的代码:

@IBOutlet weak var llllll: UILabel!
class CyclicDay {
    enum CyclicDayError: Error {
        case invalidStartDate }
    lazy var baseline: NSDate? = {
        var components = DateComponents()
        components.day = 2
        components.month = 5
        components.year = 2016
       * return NSCalendar.current.dateComponents(components) }()
    func dayOfCycle(_ testDate: NSDate) throws -> Int {
        if let start = baseline {
            let interval = testDate.timeIntervalSince(start as Date)
            let days = interval / (60 * 60 * 24)
            return Int(days.truncatingRemainder(dividingBy: 14)) + 1 }
        throw CyclicDayError.invalidStartDate }}

尝试使用日历和日期,而不是NSCalendar或NSDate。它可以解决这个问题。在swift 3.0中,大多数“NS”前缀都被删除了

尝试使用日历和日期,而不是NSCalendar或NSDate。它可以解决这个问题。大多数“NS”前缀在swift 3.0中都被删除了。首先,为什么
baseline
是可选的?2016年5月2日无疑是存在的

Swift 3相当于

lazy var baseline: Date = {
    let components = DateComponents(year:2016, month:5, day:2)
    return Calendar.current.date(from:components)!
}()

首先,为什么
baseline
是可选的?2016年5月2日无疑是存在的

Swift 3相当于

lazy var baseline: Date = {
    let components = DateComponents(year:2016, month:5, day:2)
    return Calendar.current.date(from:components)!
}()
有几个问题:

  • 在Swift 3中,您应该使用
    日历
    日期
    ,而不是
    NSCalendar
    NSDate

  • DateComponents
    获取
    Date
    对象的方法是。
    dateComponents
    方法用于转到另一个方向,从
    Date
    确定
    dateComponents

  • 因此:

    有几个问题:

  • 在Swift 3中,您应该使用
    日历
    日期
    ,而不是
    NSCalendar
    NSDate

  • DateComponents
    获取
    Date
    对象的方法是。
    dateComponents
    方法用于转到另一个方向,从
    Date
    确定
    dateComponents

  • 因此:


    Date在每个实例中都返回了一个错误,直到我读到Swift 3要求的NSDate。当然,没有更多的错误。好的,谢谢你的信息!现在它的内容是:return Calendar.current.dateComponents(components)}(),但是,新的错误是:“dateComponents”生成“dateComponents”,而不是预期的上下文结果类型“Date?”,谢谢,rob,想以aswer的身份发布,这样我就可以相信你了?顺便说一句,我知道你只是想编译这段代码,但这有点危险。如果用户没有使用公历怎么办?你将得到的日期将与你计划的日期大不相同。我可能会建议使用
    日历(标识符:.gregorian)
    而不是
    日历。如果您要硬编码2016年2月5日,则使用当前的
    。您可能需要记下一点,以查看代码与非公历的一般兼容性。如果这是最初的开发人员唯一做出这种假设的地方,我会感到惊讶。Date在每个实例中都返回了一个错误,直到我读到Swift 3需要NSDate。当然,没有更多的错误。好的,谢谢你的信息!现在它的内容是:return Calendar.current.dateComponents(components)}(),但是,新的错误是:“dateComponents”生成“dateComponents”,而不是预期的上下文结果类型“Date?”,谢谢,rob,想以aswer的身份发布,这样我就可以相信你了?顺便说一句,我知道你只是想编译这段代码,但这有点危险。如果用户没有使用公历怎么办?你将得到的日期将与你计划的日期大不相同。我可能会建议使用
    日历(标识符:.gregorian)
    而不是
    日历。如果您要硬编码2016年2月5日,则使用当前的
    。您可能需要记下一点,以查看代码与非公历的一般兼容性。如果这是最初的开发人员做出这种假设的唯一地方,我会感到惊讶。我不完全确定,正如问题中所述,这是我没有编写的代码的唯一部分。我只是从2016年开始继续另一个人的代码。
    date(from:components
    可以返回可选日期,因为组件可能超出范围(例如
    day:32
    ),但在这种情况下,根本没有理由使用可选日期。可选日期可以安全地展开。顺便说一句:在日期数学中使用
    86400
    作为常量是非常糟糕的编程习惯。我不完全确定,正如问题中所述,这是我没有编写的代码的唯一部分。我只是继续了另一个人的代码,从20开始16.
    date(from:components
    可以返回可选日期,因为组件可能超出范围(例如
    day:32
    ),但在这种情况下根本没有理由使用可选日期。可以安全地打开可选日期。顺便说一句:使用
    86400
    作为日期数学常量是非常糟糕的编程习惯。
    lazy var baseline: Date = {
        var components = DateComponents()
        components.day = 2
        components.month = 5
        components.year = 2016
        return Calendar.current.date(from: components)!
    }()