2016-09-25 2 views
5

Ich verwende eine SQLite-Bibliothek, in der Abfragen optionale Werte zurückgeben und Fehler auslösen können. Ich möchte den Wert bedingt auspacken oder null erhalten, wenn ein Fehler zurückgegeben wird. Ich bin mir nicht ganz sicher, wie man Wort dies, wird dieser Code erklären, das ist, wie es aussieht:Funktion wirft und gibt optional .. möglich, um in einer Zeile bedingt auszupacken?

func getSomething() throws -> Value? { 
    //example function from library, returns optional or throws errors 
} 


func myFunctionToGetSpecificDate() -> Date? { 
    if let specificValue = db!.getSomething() { 
     let returnedValue = specificValue! 
     // it says I need to force unwrap specificValue, 
     // shouldn't it be unwrapped already? 

     let specificDate = Date.init(timeIntervalSinceReferenceDate: TimeInterval(returnedValue)) 
     return time 
    } else { 
     return nil 
    } 

} 

Gibt es eine Möglichkeit unwrap zu zwingen, es zu vermeiden, dass? Vor der Aktualisierung auf Swift3 war ich nicht gezwungen, hier auszupacken.

Das Folgende ist der eigentliche Code. Nur versuchen, die aktuelle Zeitmarke aus allen Einträgen zu erhalten:

func getLastDateWithData() -> Date? { 
    if let max = try? db!.scalar(eventTable.select(timestamp.max)){ 

     let time = Date.init(timeIntervalSinceReferenceDate: TimeInterval(max!)) 

     // will max ever be nil here? I don't want to force unwrap! 
     return time 

    } else { 
     return nil 
    } 
} 

Antwort

6

Wenn eine Funktion und kehrt eine optionale

wirft
func getSomething() throws -> Value? { ... } 

dann try? getSomething() gibt eine „doppelte optional“ des Typ Value?? und Sie muss zweimal auspacken:

if let optval = try? getSomething(), let val = optval { 

} 

Hier die erste Bindung let optval = ... ist erfolgreich, wenn die Funktion nicht ausgelöst hat und die zweite Bindung let val = optval erfolgreich ist, wenn der Rückgabewert nicht nil ist.

Dies kann mit case let Musterabgleich zu

if case let val?? = try? getSomething() { 

} 

verkürzt werden, wo val?? eine Abkürzung für .some(.some(val)) ist.

+0

Genau das, was ich gesucht habe. Ich habe nicht gesehen, ob der Fall vorher geschehen ist, ich werde darüber lesen müssen. Auch was meinst du mit .some (.some (val)). –

+0

@ twiz_: Optional ist eine Aufzählung mit den Fällen '.none' und' .some (wrapped) '. '.some (.some (val))' ist ein verschachtelter optionaler Wert, der nicht null ist, und der nicht ausgepackte Wert ist ebenfalls nicht null. Hier ist ein weiteres Beispiel für die Verwendung verschachtelter Optionals http://stackoverflow.com/questions/27225232/two-or-ormore-options-in-swift. –

+0

Tricky, denn wenn Sie nur an dem Erfolg des Aufrufs interessiert sind, und nicht die zurückgegebenen Daten, können Sie leicht verwirrt sein, wenn der Aufruf Null zurückgibt, um Fehler anzuzeigen. –

Verwandte Themen