2018年1月12日金曜日

Anyな変数を使い回す

やりたいこと

ゲームとかのステージごとに、その中身を記述したクラスを独立させたいので、それを管理する変数をAny型で作っておき、それを使い回すようにしたい。

たとえば各ステージの内容をZigzagGame.swiftというステージと、NumberGame.swiftというステージを用意した場合、Storyboardで別のViewControllerにせず、一つのViewController上で切り替えて表示したい。

やり方

ステージを管理する変数をインスタンス変数として作っておく。
optionalにしてnilにできるようにするのが肝。

    var gameStage:Any? = ()
もしくは
    var gameStage:AnyObject?

また、ステージを判断できる変数も。
    var stage = 0


その後、ステージを切り替えて使う際には、前のステージで作った部品を消して、gameStage変数にnilを入れて初期化し、新たなステージのクラスで使う。
nilを入れて初期化しないと、変数の型が前のクラスになってるからエラーになっちゃうからね。
Any(要するにどんな型でも受け付ける)型なので、使う際にas! 〜 として型を明確にしてやらないといけないのがちょっと面倒だけど。

    //ステージ切り替え例
    @IBAction func nextGame(_ sender: Any) {
        if stage == 0 {
            //前のステージクリア
            (gameStage as! ZigzagGame).eyePointer.removeFromSuperview()
            (gameStage as! ZigzagGame).shapeLayer.removeFromSuperlayer()
            gameStage = nil
            //新しいステージ
            gameStage = NumberGame(baseView: self.baseView)
            (gameStage as! NumberGame).makeButtons()
            stage = 1
        } else {
            //前のステージクリア
            //数字のボタンを消す
            for i in 0..<20 {
                (gameStage as! NumberGame).buttonCollection[i].removeFromSuperview()
            }
            gameStage = nil
            //新しいステージ
            gameStage = ZigzagGame(baseView: self.baseView)
            (gameStage as! ZigzagGame).apexCount = 30
            (gameStage as! ZigzagGame).animeDuration = 10
            (gameStage as! ZigzagGame).movePath()
            stage = 0
        }
    }

Any、AnyObject、AnyClass

いろんな型を入れられる変数型が複数ある。
  • Any
    • 整数、関数、構造体などのすべての型を扱える
    • var 宣言時は = () として初期化できる(何が入るかは知らんが)
  • AnyObject
    • クラスのインスタンスのみ扱える
    • var 宣言時は = () として初期化できないようだ
    • 荻原剛志さんの「詳解Swift」では‪Objective-C‬との情報交換で利用するって書いてあるけど、別に他のことに使ってもいいよね。
  • AnyClass
    • AnyObject.type として、「すべてのクラス型を暗黙に適合するためのプロトコル」って解説があるけど、よくわかんねぇっす。
    • ひょっとして変数型じゃないのかな? 関数の引数の型宣言として使って、クラス名を得るのに使うっぽい感じも? まあいいや

これでいいのか知らんが

知識がないので、ゲームステージの切り替えをこんなやり方でやっていいのか知らんけどね。もしかしたら笑われてしまうやり方かもしれませんよ。

0 件のコメント:

コメントを投稿