我有以下玩具示例
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)
知道为什么会这样吗?
答案 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
关键字声明函数或方法 表示只有在其中一个函数发出错误时才会抛出错误 参数抛出错误。这些功能和方法称为 重新抛出函数和重新抛出方法。重新定义函数和 方法必须至少有一个抛出函数参数。