

Swift初心者です。類似アプリを参考に3×3のパズルアプリを作成しております。  
0〜8のボタンで二次元配列を使ってボタンの位置を決めているのですが、どのボタンを押しても(x: 0,y:
0)で渡されてしまい、どのように設定すれば位置が決まるのかについて、叡智をお借りできればと思います。

* * *

下図を参考にしていただければと思うのですが、  
４９行目moveButtonメソッドを実行したとき、button.tagをどのように設定すれば良いのか  
どのボタンを押しても(x: 0,y: 0)で渡してしまっているので、それを解決するにはどうやったら良いか。(どう記述すれば良いか)

[code]

    @IBAction func moveButton(_ button: UIButton) {
            //ここで二次元配列にしたy,xの値が0になっている。
            for y in 0..<map.count {
                for x in 0..<map.count {
                        if map[y][x].tag == button.tag {　//0~8のどのボタンを押しても[0][0]になる　
                            searchAndMove(x: x, y: y)
                            return
                        }
                }
            }
    }
    
[/code]

該当のソースコード 全文

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var button0: UIButton!
        @IBOutlet weak var button1: UIButton!
        @IBOutlet weak var button2: UIButton!
        @IBOutlet weak var button3: UIButton!
        @IBOutlet weak var button4: UIButton!
        @IBOutlet weak var button5: UIButton!
        @IBOutlet weak var button6: UIButton!
        @IBOutlet weak var button7: UIButton!
        @IBOutlet weak var button8: UIButton!
        @IBOutlet weak var colorView: UIView!
        //ボタンをUIButtonl型で初期化
        var buttons = [UIButton]()
        //ポイントをCGポイント型で初期化
        var points = [CGPoint]()
        //mapを二次元配列UIButton型で初期化
        var map = [[UIButton]]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            buttons.append(button0)
            buttons.append(button1)
            buttons.append(button2)
            buttons.append(button3)
            buttons.append(button4)
            buttons.append(button5)
            buttons.append(button6)
            buttons.append(button7)
            buttons.append(button8)
    
            for button in buttons {
                points.append(button.frame.origin)
            }
            reset()
        }
    
    
    
        @IBAction func moveButton(_ button: UIButton) {
           //yとXの位置を探す。　ボタンタグと同じであれば、searchAndMoveにyとXの値を渡す。
            for y in 0..<map.count {
                for x in 0..<map.count {
                        if map[y][x].tag == button.tag { 　//ここでy,xの値が0になっている。
                            searchAndMove(x: x, y: y)
                            return
                        }
                }
            }
        }
    
    
    
        @IBAction func startButton(_ sender: Any) {
            reset()
        }
    
        //リセットメソッドviewDidLoad時に呼ばれる
        private func reset(){
            colorView.isHidden = true
            button8.isHidden = true
            buttons = buttons.shuffled()
    
            for button in buttons {
                points.append(button.frame.origin)
            }
    
            for index in 0..<buttons.count {
                buttons[index].frame.origin = points[index]
            }
            //ボタンを二次元配列で配置
            map = [[UIButton]]()
            map.append([buttons[0], buttons[1], buttons[2]])
            map.append([buttons[3], buttons[4], buttons[5]])
            map.append([buttons[6], buttons[7], buttons[8]])
        }
    
        //hiddenにしていたbutton8を探して入れ替える
        private func searchAndMove(x: Int, y: Int) {
            //左
            if x - 1 >= 0, map[y][x - 1] == button8 {
                xMove(beginX: x, endX: x - 1, y: y)
            //右
            } else if x + 1 <= 2, map[y][x + 1] == button8 {
                xMove(beginX: x, endX: x + 1, y: y)
            //下
            } else if y - 1 >= 0, map[y - 1][x] == button8 {
                yMove(x: x,beginY: y, endY: y - 1)
            //上
            } else if y + 1 <= 2, map[y + 1][x] == button8 {
                yMove(x: x, beginY: y, endY: y + 1)
            }
        }
    
        //x座標の動き
        private func xMove(beginX: Int, endX: Int, y: Int) {
            UIView.animate(withDuration: 0.2, animations: {
                //座標の入れ替え
                let origin = self.map[y][endX].frame.origin
                self.map[y][endX].frame.origin = self.map[y][beginX].frame.origin
                self.map[y][beginX].frame.origin = origin
            }, completion: { _ in
                //ボタンの入れ替え
                let button = self.map[y][endX]
                self.map[y][endX] = self.map[y][beginX]
                self.map[y][beginX] = button
                self.judge()
            })
        }
        //y座標の動き
        private func yMove(x: Int,beginY: Int, endY: Int) {
            UIView.animate(withDuration: 0.2, animations: {
                //座標の入れ替え
                let origin = self.map[endY][x].frame.origin
                self.map[endY][x].frame.origin = self.map[beginY][x].frame.origin
                self.map[beginY][x].frame.origin = origin
            }, completion: { _ in
                //ボタンの入れ替え
                let button = self.map[endY][x]
                self.map[endY][x] = self.map[beginY][x]
                self.map[beginY][x] = button
                self.judge()
            })
        }
    
        //クリア判定　mapの位置
        private func judge() {
            if map[0][0] == button0, map[0][1] == button1, map[0][2] == button2,
                map[1][0] == button3, map[1][1] == button4, map[1][2] == button5,
                map[2][0] == button6, map[2][1] == button7, map[2][2] == button8 {
                colorView.isHidden = false
                button8.isHidden = false
    
                let alert = UIAlertController(title: "クリア",message: "おめでとう！", preferredStyle: .alert)
                let alertAction = UIAlertAction(title: "OK", style: .default, handler: nil)
                alert.addAction(alertAction)
                present(alert, animated: true, completion: nil)
            }
        }
    }
    
[/code]

試したこと  
座標でボタンの位置を初期化しています。下の図で言う「0」ボタンは２次元配列でいうところのx,y = [2][0]となるように作っております。  
しかしデバックログを見ると、どれもx，y = [0][0]となっており取得したい値と異なっている。

補足情報  
●やっている内容  
1.ボタンを９つOutret接続  
2.配列に0〜8ボタンを代入  
3.moveButtonメソッドで xとyの値を決める  
4.searchAndMoveメソッドにxとyの値を与えて上下左右の座標を確認する  
5.もし、上記4.で確認した座標に、hiddenにしている「８」ボタンがある場合入れ替える  
6.座標の入れ替えと、ボタンの入れ替えをxMove,yMoveで行なっています。  
7.クリア判定 mapで示した座標とボタンの位置が等しい時、hiddenにしている「８」ボタンが現れ、クリアメッセージが出る。

期待する挙動(必須項目)  
49行目 moveButtonメソッドを押したとき、引数をbutton.tagから取る。  
(x: 0,y: 0)で渡してはダメなので、それを解決するにはどうやったら良いか。(どう記述すれば良いか)を知りたいです。

[![画像moveBottonメソッド\(x: 0,y:
0\)を渡してしまっている](https://i.stack.imgur.com/g3OU1.png)](https://i.stack.imgur.com/g3OU1.png)


CC BY-SA 4.0
2020-03-23T16:12:08.327
64057
2020-03-23T16:12:08.327
2020-06-17T08:14:45.997
-1
38107
question
swift ios
Swift 二次元配列を使ったボタンの配置とタグについて