はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】インデクサーについてかるくまとめてみた

はじめに

今回はインデクサーの使い方についての記事になります!

インデクサーオブジェクトを配列のように扱うことができるようになるものです。

まずは書き方を見てみましょう。

インデクサーの書き方

要素型 this[int index] {
    // getアクセサー
    get {
        // インデックスによって指定された要素の値を返す
    }
    // setアクセサー
    set{
        // インデックスによって指定された要素に値をセットする
    }
}

このようにプロパティのプロパティ名をthis[]に置き換えたような形になっています。
また、int indexのようにintである必要はなく、stringなどでも大丈夫です。
さらに、添字は1つ以上にすることもできます。

使用例

実際にインデクサーを使った例を書いてみます。

using UnityEngine;

class FailSoftArray<T>
{
    private T[] _a;

    public int Length { get; private set; }

    public bool IsError { get; private set; }   //直前の操作の結果を表す

    /// <summary>
    /// サイズを指定して配列を作る
    /// </summary>
    public FailSoftArray(int size)
    {
        _a = new T[size];
        Length = size;
    }

    /// <summary>
    /// FailSoftArrayオブジェクトのためのインデクサー
    /// </summary>
    public T this[int index]
    {
        get
        {
            if (!IsSafe(index))
            {
                IsError = true;
                return default(T);
            }
            IsError = false;
            return _a[index];
        }
        set
        {
            if (!IsSafe(index))
            {
                IsError = true;
                return;
            }
            IsError = false;
            _a[index] = value;
        }
    }

    /// <summary>
    /// インデックスが配列の上限と下限の範囲内ならtrueを返す
    /// </summary>
    private bool IsSafe(int index)
    {
        if (index < 0) return false;
        if (index >= Length) return false;

        return true;
    }
}

public class Hoge : MonoBehaviour
{
    private void Start()
    {
        FailSoftArray<int> failSoftArray = new FailSoftArray<int>(10);

        failSoftArray[5] = 1;                                       //これは正常に代入される
        if (failSoftArray.IsError) Debug.Log("配列の範囲外です");   //これは実行されない

        int x = failSoftArray[12];                                  //これは配列の範囲外なので0が代入される
        if (failSoftArray.IsError) Debug.Log("配列の範囲外です");   //これは実行される
    }
}

これはファイルソフト (fail soft)な配列の実装例です。
ファイルソフトというのは機能や性能を制限するかわりにプログラムを止めないようにする考え方になります。

HogeクラスStartメソッドに注目すると、インデクサーのおかげで本物の配列のように操作することができています

ただ本物の配列と違い、配列の範囲外の添字を扱ってもプログラムが止まることはなく適切に処理することが可能になっています。

さいごに

インデクサーを使うことでオブジェクトを配列のように扱うことができました。
是非うまく活用してみてください!