2

我正在从 Swift 迁移到 Kotlin,到目前为止我很喜欢它。但是,我习惯于声明这样的方法(假设引用的方法存在并且有效):

// Swift method declaration
func drawCircle(inRect rect: CGRect, antialiased: Bool) {
    super.antialiased = antialiased
    super.drawCircle(inRect: rect)
}

并像这样称呼他们:

drawCircle(inRect:myRect, antialiased: false)

这是精美的自我记录,读起来像英语。然而,在 Kotlin 中,类似的方法是这样的:

fun drawCircle(inRect: Rectangle, antialiased: Boolean) {
    super.antialiased = antialiased
    super.drawCircle(inRect)
}

使用名为inRect. 但是当我调用它时它变得更糟:

drawCircle(myRect, false)

在这里,我们看到了最大的问题:人们可能仅通过阅读这条线就可以猜出它myRect是一个矩形,圆形将在其中绘制。然而,什么是true?它可能是抗锯齿,是的,但也可能是是否不透明地绘制它,或者是关于是否绘制它的一些切换!无论如何,我可以列举更多为什么 Swift 和 Objective-C 程序员喜欢他们的方法调用标签的原因,但我已经说明了我的观点。

有什么方法可以在 Kotlin中的方法调用上启用标签?

4

1 回答 1

7

据我所知,没有编译器选项可以强制使用这种语法,但您仍然可以在代码中使用它,请参阅文档:命名参数

简而言之,您的函数的语法是

drawCircle(inRect = myRect, antialiased = false)

您甚至可以使用命名参数更改调用中的函数参数顺序。

drawCircle(antialiased = false, inRect = myRect)

限制是:

  • 您不能使用这种语法调用 Java 方法,因为 Java 字节码并不总是保留参数名称;

  • 混合定位(未命名)和命名参数是有限的:所有命名参数都应该在定位参数之后:

    fun f(x: Int, y: Int, z: Int) = 0
    
    f(x = 0, y = 0, z = 0) // OK
    f(0, y = 0, z = 0) // OK
    f(0, z = 0, y = 0) // OK
    f(x = 0, 0, 0) // Error
    
于 2016-08-20T02:35:03.553 回答