如果使用`if let`和`try?`,会返回可选值。

6 浏览
0 Comments

如果使用`if let`和`try?`,会返回可选值。

我在使用一个SQLite库,其中的查询返回可选值,并且可能会抛出错误。我想要有条件地解包这个值,如果返回错误则接收nil。我不太确定如何表达这个意思,这段代码将会解释,它看起来像这样:

func getSomething() throws -> Value? {

//库中的示例函数,返回可选值或抛出错误

}

func myFunctionToGetSpecificDate() -> Date? {

if let specificValue = db!.getSomething() {

let returnedValue = specificValue!

//它说我需要强制解包specificValue,它不应该已经解包了吗?

let specificDate = Date.init(timeIntervalSinceReferenceDate: TimeInterval(returnedValue))

return time

} else {

return nil

}

}

有没有办法避免在这里强制解包?在更新到Swift3之前,我不需要在这里强制解包。

以下是实际的代码。只是尝试从所有条目中获取最新的时间戳:

func getLastDateWithData() -> Date? {

if let max = try? db!.scalar(eventTable.select(timestamp.max)){

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

//在这里max会是nil吗?我不想强制解包!

return time

} else {

return nil

}

}

0
0 Comments

在Swift 5之前,如果一个函数既抛出异常又返回一个可选值,那么在使用try?时会得到一个"双重可选值",类型为Value??,需要进行两次解包。首先,第一个绑定let optval = ...只有在函数没有抛出异常时才会成功,然后第二个绑定let val = optval只有在返回值不为nil时才会成功。

在Swift 5中,try?应用于一个可选表达式时不会增加额外的可选性层级,只需要一个普通的可选绑定即可。如果函数既没有抛出异常又没有返回nil,则绑定成功,val将会是解包后的结果。

为了简化代码,可以使用case let模式匹配来缩短上述过程。使用if case let val?? = try? getSomething() {},其中val??.some(.some(val))的简写形式。这里的第一个绑定let optval = ...只有在函数没有抛出异常时才会成功,第二个绑定let val = optval只有在返回值不为nil时才会成功。

如果只对函数调用的成功与否感兴趣,而不关心返回的数据,可能会因为调用返回nil来表示失败而产生混淆。

如果一个函数调用返回空值,可以使用let optval = try? doSomething()并假设如果doSomething抛出异常,则optval将为nil,如果没有抛出异常则为非nil

0
0 Comments

在上述代码中,使用了两种方式来处理可能抛出错误的函数`getSomething()`的返回值。第一种方式是使用`if let`结构以及`try?`关键字,第二种方式是直接使用`let`语句以及`try?`关键字。

这里之所以需要处理可能抛出错误的函数返回值,是因为在Swift中,有些函数可能会抛出错误。而在使用这些函数的时候,我们可以选择使用`try`关键字来处理错误,或者使用`try?`关键字将错误转换为可选值。

在第一种方式中,使用了`if let`结构来判断`getSomething()`函数的返回值是否为`nil`,如果不为`nil`,则将其绑定到`value`常量中。同时,使用了`try?`关键字来处理可能的错误。如果函数执行成功,返回一个可选值,如果函数执行失败,则返回`nil`。

在第二种方式中,直接使用`let`语句将`getSomething()`函数的返回值绑定到`value`常量中。同样使用了`try?`关键字来处理可能的错误。如果函数执行成功,返回一个可选值,如果函数执行失败,则返回`nil`。

这两种方式的不同之处在于,第一种方式使用了`if let`结构,可以在满足条件的情况下执行一些特定的操作。而第二种方式则是直接将函数的返回值绑定到一个常量中,适用于不需要进行条件判断的场景。

总结起来,通过使用`try?`关键字可以将可能抛出错误的函数的返回值转换为可选值。这样可以方便地处理可能的错误情况,并根据实际需求进行相应的操作。

0