Kotlin的擴充函數:擴充Android架構(KAD 08),kotlinandroid

來源:互聯網
上載者:User

Kotlin的擴充函數:擴充Android架構(KAD 08),kotlinandroid

作者:Antonio Leiva

時間:Jan 11, 2017

原文連結:https://antonioleiva.com/extension-functions-kotlin/

 

 

擴充函數是Kotlin提供的非常酷的特性,在編寫Android應用程式時,你將發現自己會大量使用它。

 

我們必須承認Android架構有時做些事有點困難,在Java中我們唯一的解決方案是把我們要做事封裝起來,或利用可讀性差的類靜態方法。

 

你想怎樣才能加額外函數到架構類?這就是Kotlin擴充函數允許我們做的。

 

Kotlin擴充函數

 

如其名稱所隱含的,擴充函數是一種函數,它協助我們擴充類功能,而無需涉及它們的代碼。現在讓我們來看怎樣定義這些函數,以及一些我個人認為非常有用的例子。

 

怎樣定義擴充函數?

 

就如同你平常編寫函數那樣,在分隔點之前放置類名稱。這些函數可以放在任何位置上,不過通常在一個擴充(Extensions)檔案,這個擴充檔案甚至不需要包含一個類。

 

一個非常簡單的例子,我們要視圖有visible(),使它可見。我們這樣編寫:

1 fun View.visible() {2     this.visibility = View.VISIBLE3 }

 

如你所見,使用該類的功能和屬性時,我加上this保留字,就像我們是在類內部,但是你也可以省略:

1 fun View.visible() {2     visibility = View.VISIBLE3 }

 

一些有趣的例子

 

我來說明兩三個我喜歡的例子,它們很好的展示了擴充函數的能力。

 

第一個有用的例子是你在擴充(inflate)視圖內的適配器。通常你這樣用:

1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {2     val v = LayoutInflater.from(parent.context).inflate(R.layout.view_item, parent, false)3     return ViewHolder(v)4 }

 

在擴充(inflate)視圖的程式碼中使用了parent,太複雜了,並且99%時間裡通常與任何其它適配器相同。為什麼不給ViewGroups擴充視圖的能力?

1 fun ViewGroup.inflate(layoutRes: Int): View {2     return LayoutInflater.from(context).inflate(layoutRes, this, false)3 }

 

現在你可以在上面的代碼使用它:

1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {2     val v = parent.inflate(R.layout.view_item)3     return ViewHolder(v)4 }

 

一個使用映像的非常類似例子也可以這樣做。例如,如果你使用Picasso庫,你需要典型的構建器載入映像:

1 Picasso.with(imageView.context).load(url).into(imageView)

 

你想要如何能夠告知ImageView自己載入URL嗎?

1 fun ImageView.loadUrl(url: String) {2     Picasso.with(context).load(url).into(this)3 }4  5 imageView.loadUrl(url)

 

擴充屬性

 

就像你能夠擴充函數一樣,同理也能處理屬性。你需要記住的就一件事,擴充屬性不能儲存狀態,而且需要用已有函數請求或更改對象的狀態:

1 val ViewGroup.children: List2     get() = (0..childCount -1).map { getChildAt(it) }

 

這個屬性由ViewGroup的children中取出。

 

現在你就可以直接替代他們:

1 parent.children.forEach { it.visible() }

 

注意

it是一個保留字,當函數僅有一個輸入值時,用於訪問函數的輸入值。如我們在其他文章所讀到,你可以命名那些輸入值,當有多個輸入值時,在Lambda運算式左邊寫上par。

 

結論

利用擴充函數和擴充屬性,你可以擴充任何類(即使你沒有訪問其代碼),而且如同它們是類的一部分一樣使用那些擴充函數和屬性。你將看到的唯一的事就是使用匯入一個額外的檔案。

 

如果你喜歡Kotlin,要進一步的學習,建議閱讀《Android開發人員的Kotlin》一書,在書中我介紹這點和你在Android應用程式開發期間的許多事情。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.