错误:二元运算符' - ='不能应用于类型' Int?'的操作数。和' Int'

时间:2018-06-01 10:04:24

标签: ios swift

这个类似的问题已多次在S.O.上提出过。但我仍然没有收到任何解决方案。我对iOS很陌生。所以请告诉我,我是否在这里犯了任何错误.. ???

注意:我正在使用Xcode 8转换Swift 2.3 - Swift 3.2

func dateFourHoursBack() -> Date {
    let today = Date()

    let calendar = Calendar.current
    var components = (calendar as NSCalendar).components([.year, .month, .day, .hour, .minute, .second] , from: today)
    components.hour -= 4 //Error : Binary operator '-=' cannot be applied to operands of type 'Int?' and 'Int

    return calendar.date(from: components)!
}

Plz帮助我......

2 个答案:

答案 0 :(得分:1)

这是一个糟糕的转换。不要在Swift 3 +中使用NSCalendar

错误表明您无法将-=运算符应用于可选项。

与Swift 3+中的Swift 2不同,所有日期组件都是可选的,但如果在dateComponents(...行中指定了单位,则可以安全地强行打开它。

func dateFourHoursBack() -> Date {
    let today = Date()

    let calendar = Calendar.current
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second] , from: today)
    components.hour! -= 4    
    return calendar.date(from: components)!
}

顺便提一下有一个更方便的方法

func dateFourHoursBack() -> Date {
    return Calendar.current.date(byAdding: .hour, value: -4, to: Date())!
}

答案 1 :(得分:0)

因为components.hour是可选值。您必须检查是否为OR,如果您100%确定它将包含值,则使用!运算符强行打开它。

良好的做法是避免使用!操作员强行打开并安全玩耍。喜欢这个

if let hours = components.hour {
  //do your stuff here 
}