IBOutletCollectionをNSMutableArrayにする

同種のViewを配列で扱えるIBOutletCollectionは、普通に使うと変更できないNSArrayになります。ボタンのコレクションを宣言するとこんな感じ。

@property (nonatomic) IBOutletCollection(UIButton) NSArray<UIButton *> *buttons;

これをMutableにしたくて書き換えて実行すると、メソッド呼び出しでエラーになります。

@property (nonatomic) IBOutletCollection(UIButton) NSMutableArray<UIButton *> *buttons;
-[__NSArrayI sortUsingDescriptors]: unrecognized selector sent to instance 0x6000002211e0

NSArrayにはこんなメソッドないと言ってます。そう、Immutableなままなんですね。

実はMutableになるかどうかはStoryboardのソースコードにcollectionClass=”NSMutableArray”があるかどうかで決まります。例えば、プロパティ宣言したコレクションに2種類のボタンを登録するとこうなります。

<connections>
    <outletCollection property="immutableButtons" destination="tau-0k-GrV" id="8Lt-9w-0q9"/>
    <outletCollection property="immutableButtons" destination="JzQ-oO-QB5" id="URQ-Yp-crw"/>
    <outletCollection property="mutableButtons" destination="tau-0k-GrV" collectionClass="NSMutableArray" id="Vic-tH-SYR"/>
    <outletCollection property="mutableButtons" destination="JzQ-oO-QB5" collectionClass="NSMutableArray" id="2NV-P5-Fwc"/>
</connections>

自分でソースコードに追加しなくてもエラーにならなけれは自動的に付与されていると思います。

このようにOutletCollectionはMutableにもできますが、個人的にはNSArrayのままで扱うように心がけています。Mutableに変更した場合はStoryboardも確認しないとだめですし、そういった仕組みすら忘れてしまう危険があるので(^^;