2016-09-25 4 views
5

Używam biblioteki SQLite, w której zapytania zwracają opcjonalne wartości, a także mogą powodować błędy. Chciałbym warunkowo odwijać wartość lub otrzymać zero, jeśli zwraca błąd. Nie jestem całkowicie pewien, jak to słowo, to kod będzie wyjaśniać, to jak to wygląda:Funkcja wyrzuca i zwraca opcjonalnie .. możliwe warunkowe rozwinięcie w jednym wierszu?

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 
    } 

} 

Czy istnieje sposób, aby uniknąć konieczności wymuszenia tam rozpakować? Przed aktualizacją do Swift3 nie byłem zmuszony do odprężenia tutaj.

Poniżej podano rzeczywisty kod. Po prostu staramy się uzyskać najnowszy znacznik czasu ze wszystkich wpisów:

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 
    } 
} 

Odpowiedz

6

Jeśli funkcja rzuca i powraca opcjonalny

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

następnie try? getSomething() Zwraca „double opcja” z typu Value?? i ty należy rozwinąć dwukrotnie:

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

} 

Tutaj pierwsze wiązanie let optval = ... powiedzie się, jeśli funkcja nie wykonała , a druga oprawa let val = optval zastąpi , jeśli zwracana wartość nie jest nil.

ten może zostać skrócony z case let wzorzec dopasowania do

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

} 

gdzie val?? jest skrótem dla .some(.some(val)).

+0

Dokładnie tego, czego szukałem. Nie widziałem, czy przypadkiem wcześniej, będę musiał przeczytać o tym. Co masz na myśli przez .some (.some (val)). –

+0

@twiz_: Opcjonalne to wyliczenie z przypadkami '.none' i' .some (wrapped) '. '.some (.some (val))' jest zagnieżdżoną opcjonalną wartością, która nie jest zerowa, a nieopakowana wartość również nie jest zerowa. Oto inny przykład użycia opcji z opcją zagnieżdżenia http://stackoverflow.com/questions/27225232/two-or-more-optionals-in-swift. –

+0

Tricky, ponieważ jeśli interesuje Cię tylko powodzenie połączenia, a nie zwrócone dane, możesz łatwo pomylić, jeśli połączenie powróci do zera, aby wskazać niepowodzenie. –

Powiązane problemy