かっこいいenumの使い方

先日の技術書店5で購入したSpriteKitで遊ぼうという本を読んでいて、シューティングの弾の作成時にenumを使って記述する処理がかっこよかったので、頭の整理をかねて、まとめてみます。

コード

簡単に省略しますが、ざっくりこんな風に書かれていました。

   enum PlayerBullet {
        case normal
        case superHyperExtra

        private var bullet: SKSpriteNode{
            let imageName: String
            let size: CGSize
            
            switch  self {
            case .normal:
                imageName = "normal"
                size = CGSize(width: 16, height: 16)

            case .superHyperExtra:
                imageName = "superHyperExtra"
                size = CGSize(width:16, height:40)
            }

            //弾のあたり判定とかテクスチャとかの設定...
                        //...
            //...
            return bullet
        }
        private func getAction(playerPos: CGPoint) -> SKAction{
            switch self{
            case .normal:
                return //ノーマルな弾丸の動き
            case .superHyperExtra:
                return //スペシャルな弾丸の動き   
            }
        }
        func shoot(scene: SKScene?, playerPos: CGPoint){
            //弾を打つ処理
        }
    }

Swiftの列挙型の中でswitchを書いていますが、判定する対象がselfになっています。このような書き方をした場合、全ての列挙された型をcaseに含める必要があります。

enumの中でnormalとsuperHyperExtraという型を列挙しているので、関数内のSwitchでは2つの弾で異なる挙動を分けて書いています。

共通の処理はswitchの外で定義します。

呼び出し側

ノーマルな弾を使うする場合

 let bullet = PlayerBullet.normal
        bullet.shoot(scene: self.scene, playerPos: self.position)

スーパーハイパーエクストラな弾を使う場合

 let bullet = PlayerBullet.superHyperExtra
        bullet.shoot(scene: self.scene, playerPos: self.position)

違うのはbulletに設定している型のタイプだけで、呼び出す側では処理のロジックについて全く気にしなくて良い!これはかっこいい!!