我有这个功能:
func getTodaysDate() -> (day: String, date: String) {
let currentDate = Date()
let monthFormatter = DateFormatter()
let dayFormatter = DateFormatter()
monthFormatter.dateFormat = "MMMM"
monthFormatter.locale = Locale(identifier: "en_US")
let month = monthFormatter.string(from: currentDate)
dayFormatter.dateFormat = "EEEE"
dayFormatter.locale = Locale(identifier: "en_US")
let dayToday = dayFormatter.string(from: currentDate)
let calendar = Calendar.current
let dateComponents = (calendar as NSCalendar).components([NSCalendar.Unit.day], from: currentDate)
let day = String(describing: dateComponents.day)
let date = ("\(month) \(day!)")
return (day: dayToday.uppercased(), date: date.uppercased())
}
应该返回:
FRIDAY, APRIL 21
但它返回:
FRIDAY, APRIL OPTIONAL (21)
我不明白,因为常量“day”不是可选的。即使我尝试打开它,编译器也会提示它
Cannot force unwrap value of non-optional type 'String'
有人知道发生了什么事吗?
最佳答案
在 Swift 3 中(与 Swift 2 不同)所有日期组件都是可选的:
var day: Int? { get set }
错误发生是因为您从可选的 Int
创建了一个字符串。结果是一个非可选字符串,但它包含文字“Optional()”
let day = String(describing: dateComponents.day) // --> "Optional(21)"
除了使用字符串插值从字符串冗余创建字符串之外,编译器会提示,因为该字符串不是可选的。文字“Optional()”是无关紧要的。
let date = ("\(month) \(day!)")
正确的语法是
let day = dateComponents.day!
let date = ("\(month) \(day)")
我建议使用原生 Swift 3 语法(不要桥接到 NSCalendar
)
let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.day], from: currentDate)
let day = dateComponents.day! // needs to be unwrapped.
let date = ("\(month) \(day)")
因为你只需要一个组件,所以有一个更简单的语法(非可选)
let calendar = Calendar.current
let day = calendar.component(.day, from: currentDate)
let date = ("\(month) \(day)")
关于ios - 我的代码中显然有一个可选的,但编译器认为我没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546193/