【初心者向け】SwiftとKotlinのオプショナル型の書き方【安全な使い方も徹底解説】

swift_kotlin_optional

SwiftとKotlinでの書き方を同時にまとめます。

SwiftのOptional型とKotlinのNullable型の扱い方の基本をまとめてます。

すごく似ているのでまとめて覚えちゃいましょう.

SwiftとKotlinのオプショナル型の書き方

Swiftではオプショナル型でnilを、KotlinではNullable型でnullを、それぞれ許容する事が可能。

Swiftでは『nil(ニル)』、Kotlinでは『null(ヌル)』の扱いがすごく厳しいです。

この記事ではSwiftのオプショナル型とKotlinのNullable型についてそれぞれ解説していきます。

✔️ SwiftとKotlinのオプショナル型の書き方

  1. Swiftのオプショナル型
  2. KotlinのNullable型

そもそもnil・nullとは『なんもない』事を意味したもので、0とは異なります。

昔から、nil・nullの状態の変数にアクセスする事で予期せぬバグにつながるといった事があったんです…

これがSwiftにオプショナル型、KotlinにNullable型が存在する理由。

便利な使い方もあるので、以下よりそれぞれ解説していきます。

Swiftのオプショナル型

Swiftのオプショナル(Optional)型について以下のように解説していきます。

nilを安全に扱う為の方法。

使いこなせるようになるとSwiftらしいソースが書けるようになります。

Swiftのオプショナル型の書き方

Swiftでは通常の型にnilを代入しようとするとエラーになります。

そこでSwiftではオプショナル型の登場。

型名に『?』と付ける事でオプショナル型として扱う事ができます。


<!error 通常nullが入る事は許容されていない>
let value: String = nil

<!OK Optionalは型に?をつける>
let value: String? = nil

上記の例では『Stringのオプショナル型』を定義しています。

どんな型でも『?』をつければオプショナル。

『String型』をオプショナルでラップして『Stringのオプショナル型』になります。

マカダミアナッツをチョコでコーティングしてマカダミアチョコと呼ばれるイメージ。

オプショナルバインディング

Swiftのオプショナル型は、そのままでは通常の型として扱う事ができません。

Swiftのオプショナル型では、nilチェックを行う事で通常の型として扱う事ができます。

その1つが『オプショナルバインディング』。

『if let オプショナルじゃなくなった型 = オプショナル型』と書きます。


let optionalValue: String? = nil

if let value = optionalValue {
<!スコープ内ではオプショナルではなくなる>
   value.count
}

上記の例では『if let』のスコープ内では『Stringのオプショナル型』が『String型』として使えます。

オプショナルチェイン

Swiftのオプショナル型を安全に扱う方法の1つ『オプショナルチェイン』。

Optional型のままメソッドをつなげる事ができます。


let value: String? = nil

let valueCount = value?.length

<!nilが返り、valueCountにnilが入る>
nil

例えば『オプショナル型.オプショナル型.オプショナル型』という風にチェインする場合も可能で、nilになっている時点でnilを返してくれます。

上記の例の場合、『valueCount』変数もオプショナル型になるので、これを前述の『オプショナルバインディング』や、次の『??演算子』で使えばOK。

Swiftの??演算子

Swiftではオプショナル型を安全に扱う方法は他にもあります。

『??』演算子もめちゃくちゃ便利。

nilだった場合の処理が書けるif文のような感覚で使えます。


let value: String? = nil

let valueCount = value?.count ?? 0

<!上記ではnilとなる為「0」を返す>
0

上記の例では『value?.count』がnilなので『??演算子』で0を返しています。

Swiftの強制アンラップ

Swiftでオプショナル型を、一撃でアンラップする方法が『強制アンラップ』。

『!演算子』を使う事で強制アンラップする事ができます。

ただし、簡単に通常の型として扱うようにできますが、nilだったらクラッシュする為オススメしません。


let value: String? = nil

let valueCount = value!.length

<!上記ではvalueがnilとなる為、lengthにアクセスできずクラッシュ>

例えば、StoryboardからUI部品をソースにバインドした時などに『Button!』と標準で定義されちゃいますが、これはAppleが担保してくれてるとみなしてOK。

基本的に使わない方針でいた方が無難です。

KotlinのNullable型

KotlinのNullable型について以下のように解説していきます。

Swiftのオプショナル型に相当するものが、KotlinのNullable型。

Swiftのオプショナル型同様、nullを安全に扱う為の方法です。

使いこなせるようになるとKotlinらしいソースが書けるようになります。

KotlinのNullable型の書き方

Swiftのオプショナル型に相当するのが、KotlinのNullable型です。

Swiftで通常の型にnilを代入しようとするとエラーになるように、Kotlinでも通常の型にnullを代入しようとするとエラーに。

Swiftのオプショナル型と同様、型名に『?』と付ける事でNullable型として扱う事ができます。


<!error 通常nullが入る事は許容されていない>
val value: String = null

<!OK Nullableは型に?をつける>
val value: String? = null

上記の例では『StringのNullable型』を定義しています。

Swiftのオプショナル型と同じで、どんな型でも『?』をつければNullable。

『String型』をNullableでラップして『StringのNullable型』になります。

スマートキャスト

KotlinのNullable型は、そのままでは通常の型として扱う事ができません。

Swiftのオプショナル型と同じで、nullチェックを行う事で通常の型として扱う事ができます。

その1つが『スマートキャスト』。

『if (オプショナル型 != null)』でnullチェックをすれば、スコープ内は通常型として扱えます。


val value: String? = null

if (value != null) {
<!スコープ内ではNullableではなくなる>
   value.length
}

上記の例では『if 文』のスコープ内では『StringのNullable型』が『String型』として使えます。

安全呼び出し

Swiftの『オプショナルチェイン』に相当する処理。

Kotlinでは『?.』演算子で、Nullable型のままメソッドをつなげる事ができます。

演算子と言っても、見た目はSwiftのオプショナルチェインと同じ。


val value: String? = null

val valueCount = value?.length

<!nullが返り、valueCountにnullが入る>
null

Swiftのオプショナルチェインと同じで、例えば『Nullable型.Nullable型.Nullable型』という風にチェインする場合も可能で、nullになっている時点でnullを返してくれます。

上記の例の場合、『valueCount』変数もNullable型になるので、これを前述の『安全呼び出し』や、次の『エルビス演算子』で使えばOK。

Kotlinのエルビス演算子

KotlinではNullable型を安全に扱う方法は他にもあります。

それがSwiftの『??』に相当するエルビス演算子。

『?:』と書く事ができます。

nullだった場合の処理が書けるif文のような感覚で使えます。


val value: String? = null

val valueCount = value?.length ?: 0

<!上記ではnullとなる為「0」を返す>
0

上記の例では『value?.length』がnullなので『エルビス演算子』で0を返しています。

Kotlinの強制アンラップ

Swiftでオプショナル型を強制アンラップできるように、Kotlinでも『強制アンラップ』が可能です。

『!!演算子』を使う事でNullable型を、強制的に通常の型にする事ができます。

ただし、簡単に通常の型として扱うようにできますが、nullだったらクラッシュする為オススメしません。


val value: String? = null

val valueCount = value!!.length

<!error! 上記ではvalueがnullとなる為、lengthにアクセスできずクラッシュ>
kotlin.KotlinNullPointerException

Swiftの強制アンラップ同様、やはりKotlinでも基本的に使わない方針でいた方が無難です。

以上です。

いつもご静聴ありがとうございます!

エンジニアの皆さん、お疲れ様です。