とある項目の属性値を管理しようかと思い、ビットフラグ的なやつを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になっている模様。