<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>评价 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E8%AF%84%E4%BB%B7/</link><description>Recent content in 评价 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 23 Feb 2018 14:27:37 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E8%AF%84%E4%BB%B7/index.xml" rel="self" type="application/rss+xml"/><item><title>Kotlin 扩展函数详解与应用</title><link>https://pangyd.com/post/185-kotlin/</link><pubDate>Fri, 23 Feb 2018 11:31:21 +0800</pubDate><guid>https://pangyd.com/post/185-kotlin/</guid><description>&lt;h1 id="一什么是扩展函数">&lt;a href="https://www.jianshu.com/u/dcf7bd45aecd" target="_blank">一、什么是扩展函数？&lt;/a>&lt;/h1>&lt;p>扩展函数数是指在一个类上增加一种新的行为，甚至我们没有这个类代码的访问权限。这是一个在缺少有用函数的类上扩展的方法，Kotlin能够为我们做到那些令人关注的事情，而这些Java做不到。&lt;/p>&lt;p>在Java中，通常会实现很多带有static方法的工具类，而Kotlin中扩展函数的一个优势是我们不需要在调用方法的时候把整个对象当作参数传入，它表现得就像是属于这个类的一样，而且我们可以使用this关键字和调用所有public方法。&lt;/p>&lt;h1 id="二扩展函数的使用">&lt;a name="t1">&lt;/a>&lt;a href="https://www.jianshu.com/u/dcf7bd45aecd" target="_blank">二、扩展函数的使用&lt;/a>&lt;/h1>&lt;h3 id="1函数的扩展">&lt;a name="t2">&lt;/a>（1）函数的扩展&lt;/h3>&lt;p>简单来说，Kotlin扩展函数允许我们在不改变已有类的情况下，为类添加新的函数。例如，我们能够为Activity中添加新的方法，让我们以更简单术语显示toast，并且这个函数不需要传入任何context，它可以被任何Context或者它的子类调用，比如Activity或者Service：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs avrasm has-numbering">fun Context&lt;span class="hljs-preprocessor">.toast&lt;/span>(message: CharSequence, duration: Int = Toast&lt;span class="hljs-preprocessor">.LENGTH&lt;/span>_SHORT) {
 Toast&lt;span class="hljs-preprocessor">.makeText&lt;/span>(this, message, duration)&lt;span class="hljs-preprocessor">.show&lt;/span>()
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;/ul>&lt;/pre>&lt;p>当然你也可以这样写：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs avrasm has-numbering">fun Activity&lt;span class="hljs-preprocessor">.toast&lt;/span>(message: CharSequence, duration: Int = Toast&lt;span class="hljs-preprocessor">.LENGTH&lt;/span>_SHORT){
 Toast&lt;span class="hljs-preprocessor">.makeText&lt;/span>(this, message, duration)&lt;span class="hljs-preprocessor">.show&lt;/span>()
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;/ul>&lt;/pre>&lt;p>对参数的解释：&amp;nbsp;&lt;br>- Activity：表示函数的接收者，也就是函数扩展的对象&amp;nbsp;&lt;br>- . ：扩展函数修饰符&amp;nbsp;&lt;br>- toast：扩展函数的名称&lt;/p>&lt;p>我们可以在任何地方（例如在一个工具类文件中）声明这个函数，然后在我们的Activity中将它作为普通方法来直接使用（这里的两种使用方式后文会做解释）：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs scss has-numbering">override fun &lt;span class="hljs-function">onCreate(savedInstanceState: Bundle?)&lt;/span> { 
 &lt;span class="hljs-value">super&lt;/span>&amp;lt;BaseActivity&amp;gt;&lt;span class="hljs-class">.onCreate&lt;/span>(savedInstanceState)
 &lt;span class="hljs-function">toast(&lt;span class="hljs-string">"This is onCreate!!"&lt;/span>)&lt;/span>
 &lt;span class="hljs-function">toast(&lt;span class="hljs-string">"Hello world!"&lt;/span>, Toast.LENGTH_LONG)&lt;/span>
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;li>4&lt;/li>&lt;li>5&lt;/li>&lt;/ul>&lt;/pre>&lt;p>当然了，Anko已经包括了自己的toast扩展函数，跟上面这个很相似（关于Anko是什么，你可以看我的这篇文章。。。）。Anko提供了一些针对CharSequence和resource的函数，还有两个不同的toast和longToast方法：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs erlang has-numbering">&lt;span class="hljs-function">&lt;span class="hljs-title">toast&lt;/span>&lt;span class="hljs-params">(&lt;span class="hljs-string">"Hello world!"&lt;/span>)&lt;/span>
&lt;span class="hljs-title">longToast&lt;/span>&lt;span class="hljs-params">(&lt;span class="hljs-variable">R&lt;/span>.id.hello_world)&lt;/span>&lt;/span>&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;/ul>&lt;/pre>&lt;p>&lt;strong>有一点值得注意：&lt;/strong>扩展函数并不是真正地修改了原来的类，它的这些作用效果是以静态导入的方式来实现的。扩展函数可以被声明在任何文件中，因此有个通用的方式是把一系列有关的函数放在一个新建的文件里，就像我们刚才所说的工具类当中。&lt;/p>&lt;p>我觉得还是再举几个几个例子来说明一下吧，因为它们完全显示扩展函数的力量。&lt;/p>&lt;h5 id="在-toast-中的高级用法">● 在 Toast 中的高级用法&lt;/h5>&lt;p>我们首先看看这个例子：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs avrasm has-numbering">fun Context&lt;span class="hljs-preprocessor">.niceToast&lt;/span>(message: String,
 tag: String = javaClass&amp;lt;MainActivity&amp;gt;()&lt;span class="hljs-preprocessor">.getSimpleName&lt;/span>(),
 length: Int = Toast&lt;span class="hljs-preprocessor">.LENGTH&lt;/span>_SHORT) {
 Toast&lt;span class="hljs-preprocessor">.makeText&lt;/span>(this, &lt;span class="hljs-string">"[$className] $message"&lt;/span>, length)&lt;span class="hljs-preprocessor">.show&lt;/span>()
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;li>4&lt;/li>&lt;li>5&lt;/li>&lt;/ul>&lt;/pre>&lt;p>我们增加了一个默认值是类名的参数，如果这是在Java中的话，那么总数开销会以几何形式增长，而现在我们可以通过以下方式调用：&lt;/p></description></item></channel></rss>