かっこいい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に設定している型のタイプだけで、呼び出す側では処理のロジックについて全く気にしなくて良い!これはかっこいい!!