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コード)

関連記事

I20151119-165939.jpg

Swift 2.1に対応した本「詳解 Swift 改訂版」が出るぞ!

Swiftの文法に関する解説書の定番「詳解 Swift」の、Swift2.1に対応した改訂版「詳

記事を読む

20160807-113229.jpg

UITableViewのリサイズに合わせて一番下のセルを常に一番下に表示する方法

一番下のセルを表示している状態でUITableViewの下端を上に移動させると一番下のセルが隠れ

記事を読む

I20151202-232710.jpg

【Swift 2】配列(Array)を初期化する方法

Swiftで配列(Array)を初期化する方法についてまとめてみたいと思います!   

記事を読む

20140724-103334.jpg

iPhoneアプリ開発にオススメの本10選(2014年7月版)

@akio0911です。2013年12月に「レベル・目的別!iPhoneアプリ開発おすすめ本

記事を読む

I20150808-104713.jpg

【Xcode】シミュレーターリストの表示がおかしくなった時の解決方法

Xcodeのシミュレーターリストの表示が、上のスクリーンショットのようにおかしくなってしまっ

記事を読む

20141027-113224.jpg

【Swift】「詳解 Objective-C 2.0 第3版」の著者による「詳解Swift」が予約受付中!

「詳解 Objective-C 2.0 第3版」の筆者「荻原 剛志」さんによる新しい技術書「詳細

記事を読む

I20160128-101452.jpg

【解決】Playground execution terminated because the process stopped unexpectedlyが出た時の対処法

Xcodeのプレイグラウンドで「Playground execution terminated

記事を読む

I20160209-123839.jpg

【Swift】プロパティのsetとgetには異なるアクセス修飾子を指定できる

Swiftでは、プロパティのセッタ(set節)とゲッタ(get節)に異なるアクセス修飾子を指定

記事を読む

I20160417-171311.jpg

Xcodeのブレークポイントで変数の中身を通知センターに表示してみる

Xcodeのブレークポイントの機能を使って、ブレークポイントを通過した時点での変数の中身を通知セ

記事を読む

I20150721-164252.jpg

【書籍】iPhoneアプリ開発の初心者にオススメの本「詳細! Swift iPhoneアプリ開発 入門ノート」

     Swift 1.1、Xcode 6.1、iOS 8.1に対応している書籍「詳

記事を読む

PAGE TOP ↑