Swift:传入抛出异常的函数

Ken*_*bur 5 error-handling swift

我有以下玩具示例

func identity<T>(a : T) -> T{
  return a
}

func applyIdentity<T>(f : T->T, t:T) -> T{
  return f(t)
}

applyIdentity(identity, t:1)
Run Code Online (Sandbox Code Playgroud)

这可以顺利进行。但是,一旦我尝试在身份中抛出异常,如下所示:

enum MyError: ErrorType{
  case MyErrorFoo
};

func identity<T>(a : T) throws -> T{
  if (true) {
    return a
  } else {
    throw MyError.MyErrorFoo
  }
}
...
Run Code Online (Sandbox Code Playgroud)

类型检查器在applyIdentity(identity, t:1)呼叫中抱怨消息:

Argument for generic parameter 'T' could not be inferred
Run Code Online (Sandbox Code Playgroud)

知道为什么会发生这种情况吗?

Mar*_*n R 8

您的(第二个)identity()方法可能会引发错误,因此它的类型为 T throws -> T,而不是T -> T

如果applyIdentity()应该只是将抛出的错误转发f()给调用者,那么您可以将其定义为

func applyIdentity<T>(f : T throws ->T , t:T) rethrows -> T {
    return try f(t)
}
Run Code Online (Sandbox Code Playgroud)

另请参阅Swift 书中的“声明”

重新抛出函数和方法

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