Kotlin有方法CALL标签吗?

时间:2016-08-20 00:25:57

标签: kotlin self-documenting-code

我从斯威夫特搬到科特林,到目前为止一直很喜欢它。但是,我过去常常声明这样的方法(假装引用的方法存在并起作用):

// 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中的方法调用上启用标签?

1 个答案:

答案 0 :(得分:7)

据我所知,强制使用此语法没有编译器选项,但您仍可在代码中使用它,请参阅文档:Named arguments

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

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