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

関連記事

20160420-180135.jpg

【RxSwift】2つのUITextFieldに入力された数値の合計をUILabelに表示する

そろそろRxSwiftについて学び始めよう!ということで、まずは2つのUITex

記事を読む

20150525-224340.jpg

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

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

記事を読む

20160802-232454.jpg

【Xcode 7】メソッドがどこから呼びだされているかを調べる方法

Xcode 7で、メソッドがどこから呼び出されているのか調べる方法を紹介します!     方法

記事を読む

20160508-170745.jpg

SwiftTaskで失敗したタスクによって異なるエラー処理を行う方法

SwiftTaskで複数のタスクを.successでチェーンさせ、失敗したタスクによって

記事を読む

I20151103-131550.jpg

iPhoneアプリ開発にオススメの本7選(初心者向け含む)2015年11月版

Xcode 7/Swift 2/iOS 9に対応した関連書籍が揃ってきたので、iPhoneア

記事を読む

20141224-231137.jpg

【Swift】Auto Layoutで特定のデバイス・画面サイズの時だけ制約を変更する方法

Auto Layoutで、特定のデバイスや画面サイズの時だけ制約を変更する方法について紹介したい

記事を読む

I20160409-211651.jpg

Xcode 7.3の新機能についてまとめてみた

2016年3月22日にXcode 7.3がリリースされましたが、自分が知らない機能があるかもしれ

記事を読む

I20150907-185322.jpg

uGUIの使い方が分かる本「uGUIではじめるUnity UIデザインの教科書」

株式会社マイナビ様より献本御礼。 本書は、公式のUIフレームワーク「Unity UI(uGUI

記事を読む

I20160918-133158.jpg

StoryboardでChild View Controllerにデータを渡す方法(Xcode 8 & Swift 3)

Storyboardで、Child View Controllerにデータを渡す方法を紹介します

記事を読む

20150104-120413.jpg

【おすすめ本】Swiftではじめる iPhoneアプリ開発の教科書【iOS 8&Xcode 6対応】

     入門者にオススメな、Swift&Xcode 6の入門書「Swiftではじめる

記事を読む

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑