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)
知道为什么会发生这种情况吗?
您的(第二个)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关键字声明,以表明只有当它的函数参数之一抛出错误时它才会抛出错误。这些函数和方法称为 重新抛出函数和重新抛出方法。重新抛出函数和方法必须至少有一个抛出函数参数。
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |