この記事は、@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: RangesDestructuring

// 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 ClassesEquality

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])
}
共有 Twitter で共有 Facebook で共有 URL をコピー

JavaScript を有効にしてください