Swift具有Result
类型,其声明如下:
enum Result<Success, Failure: Error> {
case success(Success)
case failure(Failure)
}
可以这样使用:
enum FooError: Error {
case fizzReason
case barReason
case bazReason
}
func returnResult() -> Result<String, FooError> {
// ... 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是否具有可以以相同方式使用的类似数据类型?
答案 0 :(得分:6)
Kotlin具有Result的属性,例如isFailure和isSuccess,这些属性基本上等同于Swift的结果。
摘要
结果,Kotlin标准库中的一种类型,实际上是 执行成功与失败之间的区别联合 功能的概念—成功的T |失败可抛出,成功T 表示某些T类型的成功结果,并且Throwable 表示带有任何Throwable异常的失败。为了...的目的 效率,我们将其建模为通用内联类Result in 标准库。
结果不能用作Kotlin函数的直接结果类型,结果类型的属性也受到限制:例如
fun findUserByName(name: String): Result<User> // ERROR: 'kotlin.Result' cannot be used as a return type
fun foo(): Result<List<Int>> // ERROR
fun foo(): Result<Int>? // ERROR
var foo: Result<Int> // ERROR
但是,允许在通用容器中使用Result类型或将结果作为参数类型接收的函数:
fun findIntResults(): List<Result<Int>> // Ok
fun receiveIntResult(result: Result<Int>) // Ok
class NumberNotEvenException(var number: Int) : Exception("$number not even")
fun checkEvenNumbers(list: List<Int>): List<Result<Int>>{
var returnList = mutableListOf<Result<Int>>()
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<Int>){
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)
}
}
答案 1 :(得分:2)
我不知道Kotlin是否具有类似的功能,但这是一个应该执行相同操作的实现:
sealed class Result<out Success, out Failure>
data class Success<out Success>(val value: Success) : Result<Success, Nothing>()
data class Failure<out Failure>(val reason: Failure) : Result<Nothing, Failure>()
实际示例:
fun echoString(string : String) : Result<String, Exception> {
return if (string.isEmpty()) {
Failure(Exception("Error"))
} else {
Success(string)
}
}
fun main(args : Array<String>) {
when(val result = echoString("string")) {
is Success -> println(result.value)
is Failure -> println(result.reason)
}
}
答案 2 :(得分:2)
有多种实现方式,但是我知道(并且知道要积极维护)这两种实现方式: