Part27: 型チェックとキャスト

ことり「11連回したいよう・・・」
凛「ことりちゃん!今後Aqoursを推すなら7月まで耐えるにゃ!」
ことり「せっかくラブカストーン有り余ってるのに・・・」


ことり「今回は型チェックとキャスト。データの型に関わる言語機能です」
凛「型チェックって、変数に型があるから必要ないんじゃないの?」
ことり「そんなことないよ。継承やインターフェイスの実装で型に階層構造がある場合とか、そもそも変数の型が’Any’だったり」
凛「あー、前に出てきた例だとIdol型の変数に入ってるのがSchoolIdolProfessionalIdolか、みたいな話」
ことり「そうそう。変数の型だけじゃ、実際の型を特定できない場合があるの。そんな時に使うのがis

x is Int

ことり「x is Stringで、変数xに入っているのがString型かを判定できます。これは難しくないよね」
凛「大丈夫にゃ!」
ことり「これの逆で、x !is StringだとxStringでない場合に真になります」

ことり「次は型変換。Kotlinはかしこいので、安全なキャストはほとんど自動的にやってくれます」

ことり「xAny型だけど、x is Stringでチェックした後はString型であることがわかってるから、x.lengthみたいにString型の操作ができるようになります」
凛「む、これはたしかにかしこいにゃ」
ことり「この機能はスマートキャストといって、次のルールに沿って適用されます」

  • valで宣言したローカル変数
    • 常に適用
  • valで宣言したプロパティ
    • プロパティがprivateinternalの場合と同じモジュール内でチェックされる場合に適用、openなプロパティや独自のgetter関数を持つプロパティには適用されない
  • varで宣言したローカル変数
    • チェックと使用の間で変更されず、ラムダ式からもアクセスされない場合に適用
  • varで宣言したプロパティ
    • 適用されない(常に変更される可能性があるため)

ことり「要するに、値が変更されていないことをコンパイラが確認できる場合はスマートキャストが適用される、ってこと」
凛「じゃあ、適用されない場合はどうするにゃ?」
ことり「キャスト演算子asを使います」

ことり「Idol型の変数の値をSchoolIdol型にキャストしてます。この場合は型に互換性があるから問題なくキャストできるね」
凛「var honoka: String = x as Stringみたいにしたらどうなるの?」
ことり「変換できない型の場合は例外が発生します。もし例外を発生させたくない場合は」

ことり「こうすると、honokaの値はnullになります。null関連のお話はまた別に出てくるんだけど、String?っていう書き方はNull許容型といって、値としてnullを取ることができる型です」
凛「キャストに失敗するとnullになるのかな」
ことり「うん。キャストにas?っていう書き方をするとそうなるの」


凛「進捗どうですか」
ことり「4桁順位で推移してるよ。ちょっと本気出しちゃったかな、えへへ」
凛「それはちかりこ3枚ずつも夢じゃないにゃ!」
ことり「Aqoursの曲やってるとね、そこに私たちの声が重なるのが、なんか不思議な感じで」
凛「μ’sとAqoursはまだ直接の接点持ってないからにゃ~」
ことり「スクフェス感謝祭の前夜祭で杏ちゃんが『穂乃果ちゃん!穂乃果ちゃん!』て言ってたのもなんか嬉しかったな」
凛「縁日で鍋の具にみんなチーズケーキ狙い」
ことり「凛ちゃん」
凛「はっ!」
ことり「ちゃんと口は封じておかないとだめだったかな」
凛「あ、いや、その、り、凛が軽率だったにゃ~っ!!」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です