【发布时间】:2016-09-05 16:44:39
【问题描述】:
以下代码是日期扩展的一部分。但是,在 Swift 3 中,我遇到了一些不会消失的错误。我已经把“NSCalendar”改成了“Calendar”:
func startOfWeek(_ weekday: Int?) -> Date? {
guard
let cal = Calendar.current,
let comp: DateComponents = (cal as Calendar).components([.yearForWeekOfYear, .weekOfYear], from: self) else { return nil }
comp.to12pm()
cal.firstWeekday = weekday ?? 1
return cal.date(from: comp)!
}
func endOfWeek(_ weekday: Int) -> Date? {
guard
let cal = Calendar.current,
var comp: DateComponents = (cal as Calendar).components([.weekOfYear], from: self) else { return nil }
comp.weekOfYear = 1
comp.day -= 1
comp.to12pm()
return (cal as NSCalendar).date(byAdding: comp, to: self.startOfWeek(weekday)!, options: [])!
}
第 3 行和第 11 行: 让 cal = Calendar.current, 条件绑定的初始值设定项必须是 Optional 类型,而不是 'Calendar'
第 12 行:我有一个错误,但通过将“let comp:”更改为“var comp:”来修复它
第 14 行: comp.day -= 1 错误:二元运算符“-=”不能应用于“Int?”类型的操作数和“诠释”
我不擅长扩展,这段代码改编自我在网上找到的一个扩展,所以现在更新它被证明是困难的。有什么建议吗?
疑难解答(我尝试过的事情):
让 cal = Calendar?.current,
错误:键入“日历?”没有成员“当前”
let cal:日历? = 日历.当前,
错误:明确指定类型“日历?”为初始化器添加了额外的可选级别,使可选检查始终成功
让 cal = Calendar.current?,
错误:不能对“日历”类型的非可选值使用可选链接
【问题讨论】:
-
你应该按照编译器告诉你的去做。有些类型是可选的,现在它们不是:删除你的可选绑定。它告诉你结构应该是可变的:做它然后看看它现在是如何工作的。等等。
-
@EricAya 我尝试了 let cal:'日历? = Calendar.current' 以及 'let cal = Calendar?.current' 和 'let cal = Calendar.current?'但没有一个工作。那么如何让日历成为可选的呢?
-
只是一个猜测,
comp.day -= 1comp.day 不是左值,它只是一个名为 day 的方法的返回值...在 Objective-C 中,有一些魔法可以制作属性以这种方式工作(即它与经典 obj c 对象的点访问器不同),也许在 swift 3 中该魔法已关闭 -
试试
func startOfWeek(_ weekday: Int? = 1) -> Date? { var cal = Calendar.current cal.firstWeekday = weekday ?? 1 let comp = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self) return cal.date(from: comp) } -
@LeoDabus 谢谢,我发布了修改后的代码作为答案并感谢你。
标签: swift3 nscalendar