android - Kotlin 相当于 Swift 的 defer 关键字

标签 android swift kotlin keyword

Kotlin 中是否有类似的东西提供与 Swift 关键字“defer”相同的功能?

defer 关键字的作用是确保 defer block 中的代码在从函数返回之前得到执行。

下面是一个假设 defer 关键字存在于 Kotlin 中的例子。

    class MyClass {

        var timeStamp = 0L

        fun isEdible(fruit: Fruit): Boolean {
          defer { 
           timeStamp = System.currentTimeMillis()
          }
          if (fruit.isExpired) {
             return false
          }
          if (fruit.isRipe) {
            return true
          }
          return false
        }
     }

在上面的例子中,无论函数在什么时候返回,defer 中的 block 将被执行并且时间戳的值将在函数结束之前得到更新。

我知道 Java 有 finally {} 关键字与 try{} catch{} 一起使用,但这并不是 defer 提供的。

最佳答案

Kotlin 中没有这样的关键字,但您可以自己构建一个工作方式非常相似的结构。像这样(注意这不处理延迟 block 中的异常):

class Deferrable {
    private val actions: MutableList<() -> Unit> = mutableListOf()

    fun defer(f: () -> Unit) {
        actions.add(f)
    }

    fun execute() {
        actions.forEach { it() }
    }
}

fun <T> defer(f: (Deferrable) -> T): T {
    val deferrable = Deferrable()
    try {
        return f(deferrable)
    } finally {
        deferrable.execute()
    }
}

然后你可以像这样使用它:

class MyClass {

    var timeStamp = 0L

    fun isEdible(fruit: Fruit): Boolean = defer { d ->
      d.defer { 
       timeStamp = System.currentTimeMillis()
      }
      if (fruit.isExpired) {
         return false
      }
      if (fruit.isRipe) {
        return true
      }
      return false
    }
}

关于android - Kotlin 相当于 Swift 的 defer 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51411018/

相关文章:

android - 如何将 CellInfo 时间戳转换为实际日期?

android - 带有 Google 游戏服务的多人游戏变体

ios - 设置UIlabel的高度

android - View 模型 : Unresolved reference

android - 与observeOn组合时RxJava的startsWith操作符被忽略

android - 如何选择哪个服务来处理 Intent

android - 如何使用 OkHttp 在 Android 上实现 cookie 处理?

objective-c - 自动生成的 Swift.h 文件一直找不到

ios - iOS 13 不再支持捕获 UITableView/ScrollView(包括屏幕外部分)的屏幕截图

generics - 在 Kotlin 中从映射中过滤空键和值