当前位置: 首页 > 面试题库 >

函数抛出AND返回可选的..可能有条件地在一行中展开吗?

漆雕修能
2023-03-14
问题内容

我正在使用一个SQLite库,其中查询返回可选值,并且可能引发错误。我想有条件地解开该值,如果返回错误,则返回nil。我不太确定该如何措辞,此代码将对此进行解释,其外观如下:

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
    }

}

有没有办法避免不得不在那儿强行打开包装?在更新到Swift3之前,我并没有被迫在此处强制展开。

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

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

问题答案:

更新:Swift 5开始,
try?应用于可选表达式不会添加其他级别的可选性,因此“简单”的可选绑定就足够了。如果函数没有引发错误并且没有返回,则表示成功nilval然后绑定到展开的结果:

if let val = try? getSomething() {
    // ...
}

(Swift≤4的先前答案:) 如果函数抛出 返回可选

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

然后try? getSomething()返回该类型的“双精度可选”,则Value??必须解开两次:

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

}

在这里,let optval = ...如果函数未抛出,则第一个绑定let val = optval成功;如果返回值不是,则第二个绑定成功nil

可以通过case let模式匹配缩短到

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

}

val??的快捷方式在哪里.some(.some(val))



 类似资料:
  • 问题内容: 当我有许多可以引发异常的表达式时,例如: 有没有处理这些表达式通过某种方法 一个 功能 ,将返回一些默认值(或空)如果一个参数是无效的,并抛出一个异常-这可能发生,如果,例如: 这样我就不需要用try-catch块包围每个表达式或检查每个点是否为null。 问题答案: 用途: 这设置为链中是否有任何东西。 如果只想在非空值的情况下设置其值,请删除分配,并将其更改为:

  • 有人能帮我处理下面的代码吗?我想要一个使用函数的等价物。 只是一个音符我试过这个,但它不工作 不起作用的是-当值存在并且返回可选值时。empty()我希望原始函数返回null。它现在正在返回“随机”。 我的假设是,由于方法返回,它被替换。 请注意,原始代码是由其他人编写的。由于它有很多依赖关系,我无法更改输入/输出参数。:(

  • 我正在从第三方网站(家庭用电)检索JSON,根据我从网站请求的内容,返回的JSON可能是也可能不是数组。例如,如果我请求我的智能电表列表,我会得到这个(由于尺寸大,结果被截断): 其中 gwrcmd 是单个元素。 但是如果我要求过去半个小时的用电,我会得到这个: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个类似这样的结构(再次,被截断,因为它持续了一段时间。“版本”下有更

  • 我接受了一次采访,被问到一个问题,我想了解解决方案。 创建一个递归函数,该函数返回给定长度的数组的可能组合数,这些数组可以由非重复连续整数数组组成。 f(数组,长度)=组合 数组=[0,1,2,3] 长度=2 组合=10(所有组合:[0,0][0,1][0,2][0,3][1,1][1,2][1,3][2,2][2,3][3,3]) 请注意,允许使用[0,0],但不允许使用[1,0],因为定义了[

  • 问题内容: 带有一个简单的滤波器,可以在0-100范围内测试输入。 如果,则不返回任何内容。但是,实际上可以“不”返回任何东西吗?还是函数必须返回某些东西? 问题答案: 函数总是返回某些东西(至少在执行过程中没有到达返回语句并且到达函数的结尾时)。 另一种情况是它们被异常中断。在这种情况下,异常处理将“在堆栈上占主导”,您将返回适当的状态或得到一些讨厌的错误:) 关于您的问题,我必须说有两种可能性

  • 问题内容: 如何选择一组行,其中每一行都匹配不同的条件? 例子: 假设我有一个带有名为name的列的表,仅在第一行名称匹配“ A”,第二行名称匹配“ B”且第三行名称匹配“ C”的情况下,才需要结果。 编辑: 我想这样做是为了工作,没有固定的尺寸,但在某种程度上,我可以这样定义的序列,,,,和它的序列,每一个连续的匹配,但顺序。 问题答案: 假定您知道如何为行提供行号(例如,SQL Server中