Swift 4 でビットフラグを利用する

とある項目の属性値を管理しようかと思い、ビットフラグ的なやつをSwiftで使う方法を調べた。

参考になるのは以下のサイト。Swift 4だとOptionSetTypeではなくOptionSetのようです。

iOS ビットフラグの使い方

OptionSet (Apple公式)

struct PropertyFlags: OptionSet {
    let rawValue: Int
    static let readOnly		= PropertyFlags(rawValue: 1 << 0)
    static let hidden		= PropertyFlags(rawValue: 1 << 1)
    static let comment		= PropertyFlags(rawValue: 1 << 2)
    static let directory	= PropertyFlags(rawValue: 1 << 3)
    static let link			= PropertyFlags(rawValue: 1 << 4)
}

var properties: PropertyFlags = []
properties.insert(.readOnly) // フラグの追加

print("Result: \(properties.contains(.hidden))")
// Result: false

OptionSetで利用することができるメンバ関数の一覧。XCodeのヘルプからOptionSetでは引けなかったので一覧にしてみた。詳しくは後述。Swift 4ではexclusiveOrは無さそう。
以下の引数などはいずれも宣言時のOptionSetで宣言しているエレメント。上記の例でいくと.hiddenとかのこと。戻り値がOptionSetになっているものは、たとえば自身に代入可能。

Bool contains(member) // 指定されたエレメントが含まれているかどうかを確認。
(Bool, member) insert(member) // 指定したエレメントがなければ、Boolにtrueを返して指定した値を追加する。既に存在している場合はBoolでfalseを返して、追加する前のエレメントを返す
OptionSet? remove(member) // 指定されたエレメントを削除。削除できれば削除したエレメントを返して、削除できない場合(存在しない場合)は nil を返す
OptionSet? update(with)

// 以下は複数のエレメントを Set で指定したいときに利用
OptionSet union(other)
OptionSet intersection(other)
OptionSet symmetricDifference(other)
Void formIntersection(other)
Void formSymmerticDifference(other)
Void formUnion(other)
Void subtract(other) // 複数エレメントを削除
OptionSet subtracting(other)

Bool isDisjoint(with)
Bool isEmpty
Bool isStrictSubset(of)
Bool isStrictSuperset(of)
Bool isSubet(of)
Bool isSuperset(of)


OptionSetはRawRepresentableとSetAlgebraを継承しているプロトコル。上記メンバは主にSetAlgebraで実装されているもの。投稿時点では大多数のメンバがBetaになっている模様。

RawRepresentable (Apple公式)

SetAlgebra (Apple公式)

フォローする