2017-04-21 18 views
1

Ich habe diese Funktion:Ich habe offenbar eine optionale in meinem Code, aber der Compiler denkt, ich habe nicht

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

} 

Welche zurückkehren sollte:

FREITAG, 21. April

Aber stattdessen gibt es zurück:

FRI TAG, APRIL OPTIONAL (21)

Was ich nicht bekomme, weil die Konstante 'Tag' nicht optional ist. Selbst wenn ich es der Compiler versuchen Abwickeln beklagt, dass es

nicht unwrap Wert von nicht-optionalen Typ ‚String‘ erzwingen

Hat jemand eine Idee, was los ist?

+6

Ist 'dateComponents.day' nicht optional? Wenn Sie einen Initializer "Optional in einer Zeichenfolge" verwenden, erhalten Sie das gefürchtete "optionale" Literal. Entpacken Sie diese Eigenschaft, bevor Sie sie im String-Initialisierer verwenden. – Moritz

+0

Was Eric sagte, was Sie brauchen, ist ein 'wenn dayAsInt = dateComponents.day lassen {...}' weil · Tag ein optional, siehe https://developer.apple.com/reference/foundation/ datecomponents/1779808-day – muffe

+0

'String (Beschreibung: dateComponents.day)' entpackt das optionale nicht, es druckt nur die Debug-Beschreibung – redent84

Antwort

3

In Swift 3 (im Gegensatz zu Swift 2) alle aktuellen Komponenten sind optional:

var day: Int? { get set } 

Der Fehler trat auf, weil Sie eine Zeichenfolge aus einer optionalen Int erstellt. Das Ergebnis ist ein nicht-optionaler String, aber es enthält wörtliche „Optional()“

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

Neben der redundanten Schaffung einer Zeichenkette aus einem String mit String Interpolation der Compiler beschwert sich, da die Zeichenfolge nicht optional. Das Literal "Optional()" ist irrelevant. dort

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

Die korrekte Syntax ist

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

I nativen Swift 3 Syntax (keine Überbrückung zu NSCalendar)

let calendar = Calendar.current 
let dateComponents = calendar.dateComponents([.day], from: currentDate) 
let day = dateComponents.day! // needs to be unwrapped. 

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

Da Sie nur eine Komponente verwenden müssen empfehlen, ist eine einfachere Syntax (nicht optional)

let calendar = Calendar.current 
let day = calendar.component(.day, from: currentDate) 

let date = ("\(month) \(day)") 
+0

Die einfachere Syntax funktioniert perfekt. Vielen Dank. – MHCsk

Verwandte Themen