如何使用函数类型的别名?

时间:2019-04-24 19:43:37

标签: kotlin

我怎么使用这种打字错误?

typealias MyHandler = (Int, String) -> Unit

我尝试了这个,但是不起作用:

var myHandler = MyHandler(1, "2")

2 个答案:

答案 0 :(得分:1)

您正在尝试实例化类型别名,并收到interface doesn't have a constructor错误。据我了解,具有函数类型的类型别名可以通过三个步骤来工作:

  1. 定义类型别名本身

    typealias MyHandler = (Int, String) -> Unit
    
  2. 声明该类型的操作

    val myHandler: MyHandler = {intValue, stringValue -> 
     // do something
    }
    
  3. 使用该动作,例如

    class Foo(val action: MyHandler) {
    
      val stateOne: Boolean = false
    
      // ...
    
      fun bar() {
    
        if (stateOne) {
          action.invoke(1, "One")
        } else {
          action.invoke(0, "notOne")
        }
      }
    }
    

答案 1 :(得分:0)

typealias只是该类型的别名:)换句话说,它只是该类型的别称。

想象一下,必须一直写(Int, String) -> Unit。使用typealias,您可以定义类似的内容来帮助您减少写的次数,即代替:

fun Foo(handler: (Int, String) -> Unit)

您可以写:

fun Foo(handler: MyHandler)

它们还有助于提供提示,这意味着它们可以为您提供一种以更上下文相关的方式描述类型的方法。想象一下实现一个应用程序,其中在整个域中,时间用Int表示。我们可以遵循的一种方法是定义:

typealias Time = Int

从那时起,每次您想要随时间专门编写某些内容时,可以使用Int来代替Time来为其他人提供更多上下文。这不是一个新类型,它只是Int的另一个名称,因此,所有与整数一起使用的东西都可以使用它。

如果您想拥有look

,还有更多