2016-08-20 17 views
1

我从Swift搬到Kotlin,到目前为止都非常喜欢它。不过,我已经习惯了声明的方法是这样的(假装引用的方法存在和工作):Kotlin有方法CALL标签吗?

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

,并美其名曰是这样的:

drawCircle(inRect:myRect, antialiased: false) 

这是美丽的自我记录和读取类似英语。然而,在科特林,类似的方法是这样的:

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

它已经开始听起来奇怪使用一个名为inRect变量。但后来事情变得更糟糕,当我把它叫做:

drawCircle(myRect, false) 

在这里,我们看到的最大的问题:人们可以通过读此行myRect是在圆将绘制一个矩形可能猜测。但是,什么是true?这可能是反锯齿,是的,但它也可能是否是不透明的绘制,还是一些关于是否绘制它的切换!无论如何,我可以举更多的理由说明Swift和Objective-C程序员为什么用方法调用来爱他们的标签,但我已经明白了我的观点。

有什么办法可以在方法上打标签在Kotlin?

回答

6

据我所知,没有编译器选项强制这个语法,但你仍然可以在你的代码中使用它,请参阅文档: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 
    
+0

美丽,谢谢:d – Supuhstar

相关问题