Kotlin初识Kotlin之扩展函数与属性
Posted woodwhale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin初识Kotlin之扩展函数与属性相关的知识,希望对你有一定的参考价值。
【Kotlin】初识Kotlin之扩展函数与属性
1、扩展函数
在Kotlin中,对于已经定义好的class,我们可以使用扩展函数的方式,给这个类动态扩展一个函数方法,使用方法也很简单,看下面例子就懂了:
fun main()
fun String.getLastChar() = this[this.length-1]
println("woodwhale".getLastChar())
上面的例子中,我们在main函数中写了一个tring.getLastChar()
函数,这是对String
类拓展了一个getLastChar()
函数,作用就是获取最后一位的Char
在上述拓展函数中,this
指的是当前这个对象,也就是自己这个字符串。在写拓展函数的时候我们可以具体分析情况来使用this
上述代码也可以这么写:
fun main()
println("woodwhale".getLastChar())
fun String.getLastChar(): Char
val index = this.length - 1
return this[index]
从中我们可以看到,扩展函数可以在任何地方定义
如果是内部类、嵌套类中的方法,或者伴生类中的方法,也可以使用同样的方式来拓展
fun main()
fun Test.Companion.sout() = println("伴生类拓展函数")
Test.sout()
fun Test.InnerTest.sout() = println("内部类拓展函数")
Test().InnerTest().sout()
fun Test.TestB.sout() = println("嵌套类拓展函数")
Test.TestB().sout()
class Test
class TestB
inner class InnerTest
companion object
/*
伴生类拓展函数
内部类拓展函数
嵌套类拓展函数
进程已结束,退出代码0
*/
需要注意的是,如果扩展的函数名已经存在了原来的类中,那么或默认调用类中的成员方法
fun main(args: Array<String>)
val extension = ExtensionTest()
// 此处调用的会是成员方法
extension.test()
class ExtensionTest
fun test() = print("成员方法")
// 该方法不会被调用
fun ExtensionTest.test() = println("扩展方法")
2、扩展属性
在了解了扩展函数之后,我们也就不难理解扩展属性了
同样的方式来定义一个扩展的属性
但是在使用之前,我们需要知道扩展属性的几个限制:
- 扩展属性不能有初始值
- 扩展属性不能用filed关键字访问幕后字段
- val必须提供get方法,var必须提供get和set方法。
class Test
val name = "woodwhale"
class TestB
inner class InnerTest
companion object
val Test.property: String get() = this.name.uppercase()
val Test.TestB.property : String get() = Test().name.uppercase()
val Test.InnerTest.property: String get() = Test().name.uppercase()
val Test.Companion.property: String get() = Test().name.uppercase()
fun main()
println(Test().property)
println(Test.property)
println(Test.TestB().property)
println(Test().InnerTest().property)
3、Kotlin中常用的扩展
在Kotlin源码中定义了大量的扩展,例如:let
、run
、apply
、with
,了解这些扩展函数的作用可以大大提高我们的代码效率!
我在网上发现了一篇写的非常详细的Kotlin常用扩展函数的博文,直接指路!
Kotlin专题「一」:你了解Kotlin的let,with,run,apply,also作用域函数的区别吗?
以上是关于Kotlin初识Kotlin之扩展函数与属性的主要内容,如果未能解决你的问题,请参考以下文章