Kotlin是否具有像Swift

时间:2019-07-05 09:35:32

标签: swift kotlin types

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是否具有可以以相同方式使用的类似数据类型?

3 个答案:

答案 0 :(得分:6)

Kotlin具有Result的属性,例如isFailureisSuccess,这些属性基本上等同于Swift的结果。

摘要

  

结果,Kotlin标准库中的一种类型,实际上是   执行成功与失败之间的区别联合   功能的概念—成功的T |失败可抛出,成功T   表示某些T类型的成功结果,并且Throwable   表示带有任何Throwable异常的失败。为了...的目的   效率,我们将其建模为通用内联类Result in   标准库。

Limitation

结果不能用作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

Usage(run online)

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)

有多种实现方式,但是我知道(并且知道要积极维护)这两种实现方式:

  • Kotlin-result-简单的结果类型,非常有用(在README.md中引用了其他实现)
  • Either in Arrow-Either的Kotlin实现,可以用作结果。 (Arrow有很多有趣的功能性东西)