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

Swift中的掷球和掷球有什么区别?

东方海
2023-03-14
问题内容

经过寻找一些参考的数字出来,-unfortunately-我找不到任何关于理解之间的差异有用-和简单-
描述throwsrethrows。当试图了解我们应该如何使用它们时,这有点令人困惑。

我要说的是,我对-default-最为熟悉,它throws具有传播错误的最简单形式,如下所示:

enum CustomError: Error {
    case potato
    case tomato
}

func throwCustomError(_ string: String) throws {
    if string.lowercased().trimmingCharacters(in: .whitespaces) == "potato" {
        throw CustomError.potato
    }

    if string.lowercased().trimmingCharacters(in: .whitespaces) == "tomato" {
        throw CustomError.tomato
    }
}

do {
    try throwCustomError("potato")
} catch let error as CustomError {
    switch error {
    case .potato:
        print("potatos catched") // potatos catched
    case .tomato:
        print("tomato catched")
    }
}

到目前为止还不错,但是在以下情况下会出现问题:

func throwCustomError(function:(String) throws -> ()) throws {
    try function("throws string")
}

func rethrowCustomError(function:(String) throws -> ()) rethrows {
    try function("rethrows string")
}

rethrowCustomError { string in
    print(string) // rethrows string
}

try throwCustomError { string in
    print(string) // throws string
}

到目前为止我所知道的是当调用一个函数时throws必须由a处理try,与rethrows。所以呢?!在决定使用throws或时应遵循的逻辑是什么rethrows


问题答案:

从“声明”在斯威夫特书:

重投功能和方法

可以使用rethrows关键字声明函数或方法,以表明仅当函数的一个函数参数抛出错误时,该函数或方法才会抛出错误。这些功能和方法称为 重新抛出函数
重新抛出方法 。抛出函数和方法必须至少具有一个抛出函数参数。

一个典型的例子是map方法:

public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

如果map使用非抛出转换调用if ,则它本身不会抛出错误,并且可以在没有以下情况的情况下调用try

// Example 1:

let a = [1, 2, 3]

func f1(n: Int) -> Int {
    return n * n
}

let a1 = a.map(f1)

但是,如果map使用throwing闭包调用,则本身可以抛出,必须使用调用try

// Example 2:

let a = [1, 2, 3]
enum CustomError: Error {
    case illegalArgument
}

func f2(n: Int) throws -> Int {
    guard n >= 0 else {
        throw CustomError.illegalArgument
    }
    return n*n
}


do {
    let a2 = try a.map(f2)
} catch {
    // ...
}
  • 如果map声明为throwsrethrowstry即使在示例1中也必须调用它,这“很不方便”,并且使代码不必要。
  • 如果map没有声明,throws/rethrows则无法像示例2那样使用抛出闭包来调用它。

同样是从雨燕标准库的其它方法取功能参数真:filter()index(where:)forEach()和许多许多。

就你而言

func throwCustomError(function:(String) throws -> ()) throws

表示即使使用非抛出参数调用也可能抛出错误的函数,而

func rethrowCustomError(function:(String) throws -> ()) rethrows

表示仅当使用throwing参数调用时才会引发错误的函数。

粗略地说,rethrows是针对那些不会“独自”抛出错误,而仅从其函数参数中“转发”错误的函数。



 类似资料:
  • 当变量d1和d2不是正确的数据类型时,我总是得到默认的NumberFormatExctive消息。 当使用throw语句条件捕捉到这些异常时,我想打印自定义异常消息。 } 这是输入值格式不正确时打印的消息示例。 输入一个数值:$Exception in thread“main”java。lang.NumberFormatException:用于java的输入字符串:“$”。base/jdk。内部的

  • 有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出? 我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。 然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗

  • 我遇到了一个奇怪的情况,我试图找到(部分)位于多边形中的任何地理空间对象。当我使用WGS84 SRID在两个几何图形上应用函数时,多边形与多边形以北的一个点的交点返回,如预期: 现在,当我运行相同的查询时,但是使用两个地理位置而不是几何位置,查询返回< code>TRUE: 我期望地理版本使用最短的大圆距离来创建多边形,而几何版本在平面上创建多边形,然后将其投影到WGS84椭圆上。 有人能证实或揭

  • 我写了一个突破式的游戏,除了球棒碰撞和反射之外,它都可以工作。如果球击中球棒时从左向右移动,那么它应该起作用: 如果它撞到左端,它会沿着原来的方向反弹。如果它撞到右端,它会沿着相同的方向反弹 对于从右向左的方向,反之亦然。以及: 如果它击中中间区域,它会以相同的角度反弹如果它击中中间的左/右区域,它会反弹回来,角度略有变化。 它有时也会穿过球棒,即使它在球棒上方,也应该反弹,这很令人困惑,但我认为

  • 我有两个类(SimManager和Sim),我想为它们创建模拟对象,然后使用存根方法。 测试在上面第9行抛出这两个错误跟踪。 第一: Java语言lang.VerifyError:org/mockito/cglib/core/reflectils at org。莫基托。cglib。果心KeyFactory$发电机。在org上生成Class(KeyFactory.java:167)。莫基托。cgli

  • 你好堆栈溢出,我有一个小问题与这个程序。我正在尝试制作一个程序来掷四个骰子并将三个最高的掷骰子加在一起,然后打印这三个掷骰子中最低的一个。我犯了一个错误,就是把三个最高的卷子加在一起,然后打印出四个卷子中最低的一个。 我如何解决这个问题?我在谷歌上搜索了很多,想知道如何使用列表和集合,但我找不到任何可以解决这个问题的东西。 此外,我如何才能迫使用户选择一个集合并重新滚动该集合? 基本上,我想做的是