I am using an SQLite library in which queries return optional values as well as can throw errors. I would like to conditionally unwrap the value, or receive nil if it returns an error. I'm not totally sure how to word this, this code will explain, this is what it looks like:
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
}
}
Is there a way to avoid having to force unwrap there? Prior to updating to Swift3, I wasn't forced to force unwrap here.
The following is the actual code. Just trying to get the latest timestamp from all entries:
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
}
}
I like Martin's answer but wanted to show another option:
This has the advantage of working outside of
if
,guard
, orswitch
statements. The type specifierAny?
isn't necessary but just included to show that it returns an optional:If a function throws and returns an optional
then
try? getSomething()
returns a "double optional" of the typeValue??
and you have to unwrap twice:Here the first binding
let optval = ...
succeeds if the function did not throw, and the second bindinglet val = optval
succeeds if the return value is notnil
.This can be shortened with
case let
pattern matching towhere
val??
is a shortcut for.some(.some(val))
.