質問: プログラミング初心者です。 現在スタンプカメラアプリを作成中です。 CollectionViewと配列に関しまして、質問させて頂きます。 質問内容は下記のとおりです。 質問:配列の要素にtagの値を設定するには、どのようなコーディングをすべきでしょうか。 CollectionViewと配列を用いて画像を20個ならべて、1つの画像をタップしたらCollectionViewが閉じ、画像を指定した座標に設置するという仕様を考えております。 この場合、各画像にtagの値と座標の値をあたえるといいのではと思っております。 配列のコードは下記のとおりです。 ``` override func viewDidLoad() { super.viewDidLoad() for i in 1...20 { imageArray.append(UIImage(named: "\(i).png")!) } } ``` 最初はstoryboardで各画像にtagの値をあたえようと思いましたが、配列を用いているため storyboardでtagの値をあたえることができないと思いました。 storyboardのコレクションビューの様子は下記のとおりです。 ![画像の説明をここに入力](https://i.stack.imgur.com/AfYzG.png) 20個の画像にtagの値をあたえるにはどのようなコーディングをすべきでしょうか。 また、storyboardで配列使用時20個の画像にtagの値をあたえる方法などありますでしょうか。 お手数をおかけいたしますが、ご教示願います。
回答: まだ少しわかりにくいところもあるのですが、Storyboard上に複数同種のUIControlを配置した時にtagプロパティの値によってそれらを区別する、と言った使い方が念頭にあるのだと想定して、ご質問の内容を考えさせていただきます。 *質問:配列の要素にtagの値を設定するには、どのようなコーディングをすべきでしょうか。* →tagの値を設定できるような要素を配列に入れてください。 と言うのが回答になるでしょうか。 「画像」というのがUIImageを意識しているのであれば、UIImageにはtagプロパティはありませんから、ご自分でtagプロパティを持つようなデータ型を定義されれば良いのではないでしょうか。 ``` class MyImageItem { let tag: Int let image: UIImage //...座標などの情報もこのクラスに持たせると良いのかも知れません init(tag: Int, image: UIImage) { self.tag = tag self.image = image //他の情報を持たせるなら、その初期化... } } ``` 初期化の部分は、こんな感じになります。 ``` var itemArray: [MyImageItem] = [] //MyImageItemの配列を宣言 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. itemArray.removeAll() for i in 1...20 { //tagを指定しながら初期化 itemArray.append(MyImageItem(tag: i, image: UIImage(named: "\(i).png")!)) } } ``` 今まで`imageArray[i]`で中身のUIImageを参照していた部分は`itemArray[i].image`と言った感じで書きなおすことになります。UIImageをパラメータとして渡して処理していた部分はMyImageItemを渡すように書き換えた方がわかりやすくなるかも知れません。 全然違うとか、他にも何かあればコメント等でお知らせください。