Swift:传入抛出异常的函数

时间:2015-10-06 16:15:24

标签: swift error-handling

我有以下玩具示例

read.csv.sql

这一切都顺利进行。但是,一旦我尝试在身份中抛出异常,就像这样:

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

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

applyIdentity(identity, t:1)

类型检查程序在enum MyError: ErrorType{ case MyErrorFoo }; func identity<T>(a : T) throws -> T{ if (true) { return a } else { throw MyError.MyErrorFoo } } ... 调用时抱怨消息:

applyIdentity(identity, t:1)

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

您的(第二个)identity()方法可能会抛出错误,因此它具有类型 T throws -> T,而非T -> T

如果applyIdentity()应该转发 f()向调用者抛出一个错误,然后您可以将其定义为

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

另请参阅Swift书中的"Declarations"

  

重新定义函数和方法

     

可以使用rethrows关键字声明函数或方法   表示只有在其中一个函数发出错误时才会抛出错误   参数抛出错误。这些功能和方法称为   重新抛出函数重新抛出方法。重新定义函数和   方法必须至少有一个抛出函数参数。