Swift具有Result
这样声明的类型
enum Result {
case success(Success)
case failure(Failure)
}
可以这样使用:
enum FooError: Error {
case fizzReason
case barReason
case bazReason
}
func returnResult() -> Result {
// ... Just imagine this method returns an error
}
switch returnResult() {
case .success(let string):
print(s)
case .failure(.fizzReason):
// do something
case .failure(.barReason):
// do something
case .failure(.bazReason):
// do something
}
Kotlin是否具有可以以相同方式使用的类似数据类型?
Kotlin的Result具有isFailure和isSuccess等属性,这些属性基本上等同于Swift的Result。
摘要
结果,是Kotlin标准库中的一种类型,实际上是Kotlin功能执行成功与失败结果之间的有区别的联合-Success T | Failure Throwable,其中Success T表示某种T类型的成功结果,而Thailable Throwable表示具有任何Throwable异常的失败。为了提高效率,我们将其建模为标准库中的通用内联类Result。
局限性
结果不能用作Kotlin函数的直接结果类型,结果类型的属性也受到限制:例如
fun findUserByName(name: String): Result// ERROR: 'kotlin.Result' cannot be used as a return type fun foo(): Result > // ERROR fun foo(): Result
? // ERROR var foo: Result // ERROR
但是,允许使用在通用容器中使用Result类型或将结果作为参数类型接收的函数:
fun findIntResults(): List> // Ok fun receiveIntResult(result: Result ) // Ok
用法(在线运行):
class NumberNotEvenException(var number: Int) : Exception("$number not even") fun checkEvenNumbers(list: List): List >{ var returnList = mutableListOf >() for (number in list){ if (number%2==0){ returnList.add(Result.success(number)) }else{ returnList.add(Result.failure(NumberNotEvenException(number))) } } return returnList } fun checkResult(result: Result ){ result.fold(OnSuccess= { number -> println("$number is even") },OnFailure= { if (it is NumberNotEvenException){ println("${it.number} is Odd") } }) } fun main() { checkEvenNumbers((0..100).toList()).map { checkResult(it) } }