2017-04-21 35 views
1

我有这样的功能:我显然有一个可选的在我的代码,但是编译器认为我没有

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()) 

} 

应返回:

周五4月21日

但代之它返回:

FRI DAY,APRIL可选(21)

我不明白,因为常数'天'不是可选的。甚至当我尝试解开它的编译器抱怨说,它

不能强迫非可选类型“字符串”的展开值

有没有人一个想法是怎么回事?

+6

是不是'dateComponents.day'选项?如果在字符串初始值设定项中使用可选项,将会遇到可怕的“可选”字面值。在String初始值设定项中使用它之前解包此属性。 – Moritz

+0

埃里克说什么,你需要的是一个 '如果让dayAsInt = dateComponents.day {...}' 因为.day是可选的,请参阅https://developer.apple.com/reference/foundation/ datecomponents/1779808-day – muffe

+0

'String(描述:dateComponents.day)'不打开可选项,它只是打印调试描述 – redent84

回答

3

在斯威夫特3(不像斯威夫特2)所有的日期组件是可选的:因为你从一个可选Int创建一个字符串发生

var day: Int? { get set } 

错误。其结果是一个非可选的字符串,但它包含文字“选项()”

let day = String(describing: dateComponents.day) // --> "Optional(21)" 

除了从字符串插值字符串冗余创建一个字符串的编译器会抱怨,因为该字符串不是可有可无。文字“Optional()”是无关紧要的。

let date = ("\(month) \(day!)") 

正确的语法是

let day = dateComponents.day! 
let date = ("\(month) \(day)") 

我建议既然你只需要一个组件来使用本地斯威夫特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)") 
+0

更简单的语法完美工作。非常感谢你。 – MHCsk

相关问题