Swift 2.0で追加されたOptionSetTypeがなかなか便利

公開日: : 最終更新日:2016/02/10 iPhoneアプリ開発

20150924-010943.jpg

Swift 2.0で追加されたOptionSetTypeプロトコルがなかなか便利なので紹介したいと思います!

    

スポンサード リンク

Swift 1.2までの記述方法

例えば、SpriteKitのカテゴリビットマスクや衝突テストビットマスクなどを設定する場合、Swift 1.2までは以下のように書くことができました。

let redBallCategory  : UInt32 = 0x1 << 0
let blueBallCategory : UInt32 = 0x1 << 1
let wallCategory     : UInt32 = 0x1 << 2

ballNode.physicsBody?.categoryBitMask = redBallCategory
ballNode.physicsBody?.contactTestBitMask = blueBallCategory | wallCategory

典型的なビットマスクの使い方ですね。

    

あるいは以下のようにstructを使って意味的にまとめて書くこともできました。

struct Category {
    static let RedBall  : UInt32 = 0x1 << 0
    static let BlueBall : UInt32 = 0x1 << 1
    static let Wall     : UInt32 = 0x1 << 2
}

ballNode.physicsBody?.categoryBitMask = Category.RedBall
ballNode.physicsBody?.contactTestBitMask = Category.BlueBall | Category.Wall

    

Swift 2.0のOptionSetTypeを使う

Swift 2.0で追加されたOptionSetTypeを使うと、以下のように記述できます。

struct Category : OptionSetType {
    let rawValue : UInt32

    static let RedBall  = Category(rawValue: 0x1 << 0)
    static let BlueBall = Category(rawValue: 0x1 << 1)
    static let Wall     = Category(rawValue: 0x1 << 2)
}

ballNode.physicsBody?.categoryBitMask = Category.RedBall.rawValue
ballNode.physicsBody?.contactTestBitMask = Category([.BlueBall, .Wall]).rawValue

このケースだと、「structを使うのに比べて、書くのが面倒になってない?」とも思えますが、

    

こんな感じで複数を含むグループを手軽に作れたりします。

struct Category : OptionSetType {
    let rawValue : UInt32
    static let RedBall  = Category(rawValue: 0x1 << 0)
    static let BlueBall = Category(rawValue: 0x1 << 1)
    static let Wall     = Category(rawValue: 0x1 << 2)
        
    static let Balls    = Category([RedBall, BlueBall])
}

ちなみに上記の

Category([RedBall, BlueBall])

は、SetAlgebraTypeプロトコルで用意されている

init< S : SequenceType where S.Generator.Element == Element>(_ sequence: S)

というイニシャライザを使っているみたいです。OptionSetTypeプロトコルはSetAlgebraTypeプロトコルに適合しています。

    

また、2つを合成したグループを動的に作成できたり、

var r1 : Category = Category.Balls.union(Category.Wall)

    

特定の要素を含んでいるかどうかをチェックできるメソッドcontainsが使えたり、

if r1.contains(Category.RedBall) {
    // do something
}

    

特定の要素を追加・削除できるremove/insertのようなメソッドを使えます。

r1.remove(Category.RedBall)
r1.insert(Category.RedBall)

    

詳しくは以下のリファレンスをチェックしてみてください(OptionSetTypeプロトコルは、SetAlgebraTypeプロトコルに適合しています)。

    

@akio0911はこう思った。

SetAlgebraTypeプロトコルのメソッド群が強力なので、うまく使えばコードをスッキリとさせることができそうです。

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

I20160505-011515.jpg

iOS 9以降で使えるReadable Content Guideを試してみた

iOS 9から追加されたReadable Content Guide(readableConte

記事を読む

エディタのショートカット・Auto Layout・ブレークポイントに関する詳しい解説も!「Xcode5徹底解説」

著者の@es_kumagaiさんより献本御礼。iOSアプリ開発に用いるツール「Xcode 5」の

記事を読む

I20151201-120520.jpg

【Swift 2】switch内にてguardでbreakする

Swift 2のguard内ではreturnしないと文法エラーとなりますが、実はswitch

記事を読む

I20160228-162014.jpg

詳解 Swift 改訂版のKindle版が発売。リフローに対応!

今日気付いたんですが、「詳解 Swift 改訂版」のKindle版がいつの間にか発売されていまし

記事を読む

20150410-122409.jpg

複数バージョンのXcodeを共存してMacにインストールする方法

いよいよXcode 6.3が正式にリリースされましたね。 今回は複数バージョンのXco

記事を読む

I20160513-010707.jpg

Swiftで計算型プロパティをネストさせてみる

Swiftの計算型プロパティ(Computed property、コンピューテッドプロパティ)を

記事を読む

I20160210-140020.jpg

【Xcode】モーダル表示で遷移先へ値を渡す時のハマりポイント

モーダル表示で遷移先の画面へ値を渡す際、最初はハマりやすいポイントについて解説したいと思いま

記事を読む

20140721-170305.jpg

プロトタイピングのツールや手法を学べる「プロトタイピング実践ガイド」

株式会社インプレスさまより献本御礼。 プロトタイピング実践ガイド スマホアプリの効率的なデザイ

記事を読む

20150525-224340.jpg

【Swift】クロージャをメソッドや関数の引数として渡す方法

Swiftでメソッドの引数としてクロージャを渡す方法について解説したいと思います。     

記事を読む

iPhoneゲームを簡単に開発したいならこの本がオススメ!「Sprite Kit iPhone 2Dゲームプログラミング」

iPhoneゲームアプリを簡単に開発したいなら「Sprite Kit iPhone 2Dゲームプ

記事を読む

I20170521-225453.jpg
東京駅八重洲口の「羊肉酒場 悟大」で網焼きジンギスカンを頂きました!

ゆうせいさんと株式会社 大庄さんからご招待頂き、悟大withサッポ

I20170514-165235.jpg
iPhoneと連携できる体重体組成計「Withings Body Cardio」を使ってます

ジムに通い始めて体脂肪率が落ち始めたのをキッカケに、iPhoneと

I20170507-155440.jpg
【派手髪】ハーレイクイン風の髪色に染めてもらいました

2016年10月20日、ハーレイクイン風の髪色に染めてもらいました

I20170504-173110.jpg
【メンズネイル】東京・新宿のネイルサロンでターコイズのホログラムネイルしてもらった

ネイルネタが1年分くらい溜まっているので、ちょっとずつ書いていこう

I20170502-010117.jpg
SNUGGのライトニングケーブルが耐久性高し。8ヶ月使ってますが断線の気配なし!

iPhoneの充電&転送ケーブルであるLightningケーブルっ

→もっと見る

PAGE TOP ↑