♻️

GDScriptでのタイプガードに as が便利

に公開

Godot で開発していると、型付き変数やダウンキャストに関するコードを書く場面はよくあります。
特に「あるノードが特定の型かどうかをチェックして安全に扱いたい」ときにどう書けばよいか悩む人も多いはずです。

実は GDScript には as を使ったタイプガード という便利な書き方があります。
これを知っておくだけで、コードがシンプルかつ安全になるので紹介します。
(筆者は最近知りました...)

公式ドキュメント

従来の書き方

例えば「Node を受け取って、それが Sprite2D なら処理をしたい」という場合です。

従来は次のように書いていました。

func process_node(node: Node) -> void:
    if node is Sprite2D:
        node.texture = preload("res://icon.png")

TypeScript などの言語では、この方法を使うと nodeSprite2D であると認識され、補完も効くのでそのままメンバや関数にアクセスできます。しかし Godot の場合は補完が効かず、Sprite2D のプロパティや関数に直接アクセスできない不便さがありました。

as をタイプガードとして使う

実は GDScript では、as を直接使うことで「型変換 + nullチェック」を同時にできます。

func process_node(node: Node) -> void:
    var sprite := node as Sprite2D
    if sprite:
        sprite.texture = preload("res://icon.png")

as は無理やりキャストするわけではなく、型が合っていれば値が入り違っていれば null が入るようです。これで型がついて補間も効いて快適ですね(ただし null チェックは忘れずに!)。

まとめ

  • as は キャスト演算子 であると同時に タイプガード としても使えます
  • var obj := something as Typeif obj: で自然に型判定できます
  • 冗長になりがちな is + as をまとめられるのでコードがすっきりします

Godot の GDScript は書きやすいですが、こうした小さな便利機能を知っているとさらに効率が上がります。
ぜひプロジェクトで試してみてください!

Discussion