質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.13%

Use stride(from:to:by:) Swift 2から4への書き直し中に発生したエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 848

score 13

現在、Swift 2の時に書いたパズルゲームのコードをSwift 4に書き直しているのですが、
'stride(to:by:)' is unavailable: Use stride(from:to:by:) free function instead
というエラーがstrideを使っている箇所で出てしまいます。
どうすれば解決するでしょうか?

import UIKit

class ViewController: UIViewController {

    let BTN_START = 0 //スタート
    let SCREEN = UIScreen.main.bounds.size //画面サイズ

    //変数
    var _gameView: UIView!       //ゲームビュー
    var _titleLabel: UILabel!    //タイトルラベル
    var _piece = [UIImageView]() //ピース画像(2)
    var _data = [Int]()          //ピース配置情報(2)
    var _shuffle: Int = 0        //シャッフル
    var _startButton: UIButton!  //スタートボタン


    //====================
    //UI
    //====================
    //ロード完了時に呼ばれる
    override func viewDidLoad() {
        super.viewDidLoad()

        //ゲーム画面のXY座標とスケールの指定(1)
        let vx: CGFloat = (SCREEN.width-360)/2
        let vy: CGFloat = (SCREEN.height-640)/2
        let scale = SCREEN.width/360
        _gameView = UIView()
        _gameView.frame = CGRect(x: vx, y: vy, width: 360, height: 640)
        _gameView.transform = CGAffineTransform(scaleX: scale, y: scale)
        self.view.addSubview(_gameView)

        //背景の生成
        let bg = makeImageView(frame: CGRect(x: 0, y: 0, width: 360, height: 640),
                               image: UIImage(named: "pzl0.png")!)
        _gameView.addSubview(bg)

        //絵の背景の生成
        let picturebg = makeImageView(frame: CGRect(x: 29, y: 179, width: 302, height: 302),
                                      image: UIImage(named: "pzl2.png")!)
        _gameView.addSubview(picturebg)

        //タイトルラベルの生成
        _titleLabel = makeLabel(frame: CGRect(x: 0, y: 90, width: 360, height: 70),
                                text: "15 Puzzle", font: UIFont.systemFont(ofSize: 48))
        _gameView.addSubview(_titleLabel)

        //絵のビットマップの取得
        let picture = UIImage(named: "pzl1.png")!
        let piece = UIImage(named: "pzl3.png")!
        for i in 0..<16 {
            _piece.append(makePieceImageView(frame: CGRect(
                x: CGFloat(30+(i%4)*75),
                y: CGFloat(180+Int(i/4)*75),
                width: 75, height: 75),
                                             index: i, picture: picture, piece: piece))
            _data.append(i)
            _gameView.addSubview(_piece[i])
        }

        //スタートボタンの生成
        _startButton = makeButton(frame: CGRect(x: 124, y: 455, width: 114, height: 114),
                                  image: UIImage(named: "pzl4.png")!, tag: BTN_START)
        _gameView.addSubview(_startButton)
    }

    //ラベルの生成
    func makeLabel(frame: CGRect, text: String, font: UIFont) -> UILabel {
        let label = UILabel()
        label.frame = frame
        label.text = text
        label.font = font
        label.textColor = UIColor.white
        label.textAlignment = NSTextAlignment.center
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.numberOfLines = 0
        return label
    }

    //イメージビューの生成
    func makeImageView(frame: CGRect, image: UIImage) -> UIImageView {
        let imageView = UIImageView()
        imageView.frame = frame
        imageView.image = image
        return imageView
    }

    //ピースイメージビューの生成
    func makePieceImageView(frame: CGRect, index: Int,
                            picture: UIImage, piece: UIImage) -> UIImageView {
        UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
        picture.draw(
            in: CGRect(x: CGFloat(-75*(index%4)),
                       y: CGFloat(-75*Int(index/4)),
                       width: 300, height: 300))
        piece.draw(in: CGRect(x: 0, y: 0, width: 75, height: 75))
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return makeImageView(frame: frame, image: image)
    }

    //イメージボタンの生成
    func makeButton(frame: CGRect, image: UIImage, tag: Int) -> UIButton {
        let button = UIButton(type: UIButtonType.custom)
        button.frame = frame
        button.setImage(image, for: UIControlState.normal)
        button.tag = tag
        button.addTarget(self, action: #selector(onClick(sender:)),
                         for: UIControlEvents.touchUpInside)
        return button
    }

    //====================
    //タッチイベント
    //====================
    //ボタンクリック時に呼ばれる
    @objc func onClick(sender: UIButton) {
        if sender.tag == BTN_START {
            //シャッフルの実行(8)
            _shuffle = 20
            while _shuffle > 0 {
                if movePiece(tx: rand(num: 4), ty: rand(num: 4)) {_shuffle -= 1}
            }
            for i in 0..<16 {
                let dx: CGFloat = 30+75*CGFloat(i%4)
                let dy: CGFloat = 180+75*CGFloat(i/4)
                _piece[_data[i]].frame =
                    CGRect(x: dx, y: dy, width: 75, height: 75)
            }

            //ゲーム開始
            _titleLabel.text = "15 Puzzle"
            _piece[15].alpha = 0
            _startButton.alpha = 0
        }
    }

    //タッチ開始時に呼ばれる
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if _startButton.alpha != 0 {
            return
        }
        //タッチ位置からピースの列番号と行番号を求める(3)
        let pos = touches.first!.location(in: _gameView)
        if 30 < pos.x && pos.x < 330 && 180 < pos.y && pos.y < 480 {
            let tx = Int((pos.x-30)/75)
            let ty = Int((pos.y-180)/75)
            movePiece(tx: tx, ty: ty)
        }
    }

    //ピースの移動
    func movePiece(tx: Int, ty: Int) -> Bool {
        //空きマスの行番号と列番号を求める(4)
        var fx = 0
        var fy = 0
        for i in 0..<16 {
            if _data[i] == 15 {
                fx = i%4
                fy = Int(i/4)
                break
            }
        }
        if (fx == tx && fy == ty) || (fx != tx && fy != ty) {
            return false
        }

        //ピースを上にスライド(5)
        if fx == tx && fy < ty {
            for i in fy..<ty {
                _data[fx+i*4] = _data[fx+i*4+4]
            }
            _data[tx+ty*4] = 15
        }
            //ピースを下にスライド(5)
        else if fx == tx && fy > ty {
            for i in fy.stride(to: ty, by: -1) {
       //エラー発生
                _data[fx+i*4] = _data[fx+i*4-4]
            }
            _data[tx+ty*4] = 15
        }
            //ピースを左にスライド(5)
        else if fy == ty && fx < tx {
            for i in fx..<tx {
                _data[i+fy*4] = _data[i+fy*4+1]
            }
            _data[tx+ty*4] = 15
        }
            //ピースを右にスライド(5)
        else if fy == ty && fx > tx {
            for i in fx.stride(to: tx, by: -1) {
       //エラー発生
                _data[i+fy*4]=_data[i+fy*4-1]
            }
            _data[tx+ty*4] = 15
        }

        //シャッフル時はピースの移動アニメとクリアチェックは行わない
        if _shuffle > 0 {
            return true
        }

        //ピースの移動アニメとクリアチェック(6)
        var clearCheck = 0
        for i in 0..<16 {
            let dx: CGFloat = 30+75*CGFloat(i%4)
            let dy: CGFloat = 180+75*CGFloat(i/4)

            //ピースの移動アニメ
            if _data[i] != 15 {
                UIView.beginAnimations("anime0", context: nil)
                UIView.setAnimationDuration(0.3)
                _piece[_data[i]].frame = CGRect(x: dx, y: dy, width: 75, height: 75)
                UIView.commitAnimations()
            } else {
                _piece[_data[i]].frame = CGRect(x: dx, y: dy, width: 75, height: 75)
            }

            //クリアチェック
            if _data[i] == i {clearCheck += 1}
        }

        //ゲームのクリア判定(7)
        if clearCheck == 16 {
            _titleLabel.text = "Clear!"
            _startButton.alpha = 100

            //ピースの出現アニメ
            UIView.beginAnimations("anime1", context: nil)
            UIView.setAnimationDuration(0.6)
            _piece[15].alpha = 100
            UIView.commitAnimations()
        }
        return true
    }









    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func rand(num: UInt32) -> Int {
        return Int(arc4random()%num)
    }


}

fuzzballさん、これがエラーの出ている場所です

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

A.stride(to: B, by: C) → stride(from: A, to: B, by: C)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/08 14:38

    追記させていただきました。画像をご参照ください。

    キャンセル

  • 2018/03/08 14:39

    付いたままというのはどういうことなんでしょうか

    キャンセル

  • 2018/03/08 14:40

    すみません、解決しました!!ありがとうございます!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る