ios - 我的代码中显然有一个可选的,但编译器认为我没有

标签 ios swift option-type

我有这个功能:

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/

相关文章:

iphone - 如何确保只有支持区域监控的设备才能在商店中看到我的应用程序?

ios - 单元测试网络调用(失败测试)- Swift

Swift optionals - 为什么 var a :Int? a? = 4 返回零

objective-c - 如何将十六进制转换为RGB

ios - Objective C - 每个 View Controller 的全局变量

JSON 返回 nil Swift

java - 使用Optional.of()方法进行方法链接是个好主意吗?

java - Guice 中的可选 Scoped 注入(inject)

javascript - react-native 链接找不到 project.pbxproj 文件