blog.comame.xyz

この記事は、@AndroidDev による #31DaysOfKotlin — Week 1 Recap勝手に日本語訳したものです。 基本的な文法からちょっとした TIPS まで様々なことが紹介されているので、知らないものがあったらぜひ使ってみてください。

Day 1: Elvis Operator (エルビス演算子)

Null チェックをよりスマートにするには、エルビス演算子を使ってみましょう。 Null を別の値に置き換えたり、あるいはreturnしたりもできます! Docs: Elvis Operator

val name: String = person.name ?: “unknown”
    val age = person.age ?: return

Day 2: String Templates (文字列テンプレート)

文字列に変数を埋め込むには、変数名の前に$を入れましょう。 式を入れるには${expression}のようにしてください。 Docs: String Templates

val language = “Kotlin”

    // “Kotlin has 6 characters”
    val text = “$language has ${language.length} characters”

Day 3: Destructing Declarations (分解宣言)

Android KTX では、色の成分値を割り当てるのに分解宣言を使用します。 自作のクラス内で分割代入を使用できますし、既存のクラスを拡張して追加することも可能です。(日本語名称について参考にした記事) Docs: Destructing Declarations

// 色要素
    val (red, green, blue) = color

    // 四角形
    val (left, top, right, bottom) = rect

    // 座標
    val (x, y) = point

Day 4: When Expression (When 式)

条件分岐をよりよく書くにはwhen式を使ってみましょう。 Kotlin のwhen式は、文字列リテラルや Enum、Range など何にでも使用できます!任意の関数を呼ぶことも可能です。 Docs: When

class Train(val cargo: Number?) {
        override fun toString(): String {
            return when (cargo) {
                null, 0 -> "empty"
                1 -> "tiny"
                in 2..10 -> "small"
                is Int -> "big inty"
                else -> "$cargo"
            }
        }
    }

Day 5: For loops, range expressions and destructing (For ループと Range、分解宣言)

forループは Kotlin の Range や分解宣言を使うと便利です。 Docs: Ranges, Destructuring

// 1 から 100 まで
    for(i in 1..100) {…}

    // 1 から 100 まで降順
    for(i in 100 downTo 1){…}

    // 配列の要素を1つ飛ばしで
    val array = arrayOf(“a”, “b”, “x”)
    for(i in 1 until array.size step 2 ){…}

    // 配列の要素を分解宣言で取り出す
    for((index, element) in array.withIndex()) {…}

    // Map の要素を分解宣言で取り出す
    val map = mapOf(1 to “one”, 2 to “two”)
    for( (key, value) in map){…}

Day 6: Properties (プロパティ)

Kotlin では、クラスのプロパティのゲッターとセッターが自動生成されます。必要に応じてカスタマイズすることも可能です。 Docs: Properties

class User {
        // properties
        val id: String = “” // 変更禁止。ゲッターのみ

        var name: String = “” // デフォルトのゲッターとセッター

        var surname: String = “” // カスタムゲッターとデフォルトのセッター
          get() = surname.toUpperCase() // custom getter declaration

        var email: String = “” // デフォルトのゲッターとカスタムセッター
          set(value) { // カスタムセッターの宣言
              // “value” = セッターのパラメータ
              // “field” = 自動生成されるバッキングフィールド
              if(isEmailValid(value)) field = value
          }
    }

Day 7: Data Classes and equality (データクラスと等価性)

データの保持だけが目的であれば、データクラスを使ってみましょう。構造的等価性 (Structual Equality) をチェックするequals()hashCode(),toString(),copy()などの関数が自動生成されます。 Docs: Data Classes, Equality

data class User(
        val name: String,
        val email: String,
        val address: Address,
        …
    )
    public class UserListDiffCallback: DiffUtil.Callback() {
        override fun areContentsTheSame(
             oldItemPosition: Int,
             newItemPosition: Int
        ): Boolean {
        // 自動生成された比較メソッドを使用
        return newUserList[newItemPosition] ==
               oldUserList[oldItemPosition])
    }