SwiftのOptionSetType
プロトコルの目的は何ですか?またを利用してSetAlgebraType
メソッドを使用するのとどのように違いますか?OptionSetTypeプロトコルSwift
答えて
OptionSetType
を使用すると実用的な観点からお答えします。私にとって、OptionSetType
の目的は、C/ObjCのすべてのビット操作を削除することです。
矩形の枠線を描画する関数がある場合の例を考えてみましょう。ユーザは0〜4の境界線を描くように求めることができます。
struct BorderType: OptionSetType {
let rawValue: Int
init (rawValue: Int) { self.rawValue = rawValue }
static let Top = BorderType(rawValue: 1 << 0)
static let Right = BorderType(rawValue: 1 << 1)
static let Bottom = BorderType(rawValue: 1 << 2)
static let Left = BorderType(rawValue: 1 << 3)
}
func drawBorder(border: BorderType) {
// Did the user ask for a Left border?
if border.contains(.Left) { ... }
// Did the user ask for both Top and Bottom borders?
if border.contains([.Top, .Bottom]) { ... }
// Add a Right border even if the user didn't ask for it
var border1 = border
border1.insert(.Right)
// Remove the Bottom border, always
var border2 = border
border2.remove(.Bottom)
}
drawBorder([.Top, .Bottom])
そしてCで
:typedef enum {
BorderTypeTop = 1 << 0,
BorderTypeRight = 1 << 1,
BorderTypeBottom = 1 << 2,
BorderTypeLeft = 1 << 3
} BorderType;
void drawBorder(BorderType border) {
// Did the user ask for a Left border?
if (border & BorderTypeLeft) { ... }
// Did the user ask for both Top and Bottom borders?
if ((border & BorderTypeTop) && (border & BorderTypeBottom)) { ... }
// Add a Right border even if the user didn't ask for it
border |= BorderTypeRight;
// Remove the Bottom border, always
border &= ~BorderTypeBottom;
}
int main (int argc, char const *argv[])
{
drawBorder(BorderTypeTop | BorderTypeBottom);
return 0;
}
Cが一目で、短いですが、この行が何をするのか伝えることができ
ここスウィフトのコードですか?
border &= ~BorderTypeBottom;
これはインスタント理にかなっている間:
var border2 = border
border2.remove(.Bottom)
それは言語を習得しやすい表情豊かであることのスウィフトの目的、それは異なりC.
OptionSetType
は、あなたのクラスがRawRepresentable
であり、その生の表現がBitwiseOperationsType
であると仮定すると、あなたのクラスは何かを実装せずSetAlgebraType
に適合させることができます。これは、nine methodsのデフォルトの実装をSetAlgebraType
にすることで実現します。
Set
との主な違いとの違いは、さまざまなタイプのものに何も書き込む必要がないことです。積分型。あなたの生表現可能な型をOptionSetType
に適合させるだけで、すべての実装を無料で手に入れることができます。
の質素な哲学と比較に収まりますセットはではなく、セットです。値がビットマスクであるObjective-C列挙型です。アイデアは、Set-likeの便利さと安全性でそれを操作できるような方法でSwiftにそのような列挙型をインポートする方法を提供することですが、実際にはビット単位とビット単位またはを使用して整数を形成しています。 Objective-Cでは、実際にビットワイズ演算子を使用して整数を直接構築する必要があります。しかし、スウィフトはあなたがそれをしなくて済むようにします。
したがって、あなたは言うことができる:
let val =
UIViewAnimationOptions.Autoreverse.rawValue |
UIViewAnimationOptions.Repeat.rawValue
let opts = UIViewAnimationOptions(rawValue: val)
...とObjective-Cには、あなたが実際には、それを行う必要があります。しかし、スウィフトでは代わりに言うことができます:
var opts = UIViewAnimationOptions.Autoreverse
opts.insert(.Repeat)
- 1. プロトコルと拡張機能swift
- 2. Swift 3.0プロトコルのインスタンス化
- 3. Swiftでの設定とプロトコル
- 4. Swift 2.0のプロトコル拡張メソッドディスパッチ
- 5. プロトコル拡張のSwiftプロパティオブザーバ?
- 6. Swiftプロトコルとオーバーロードのオプションメソッド
- 7. Swiftのプロトコル拡張オブジェクトがクラスでプロトコルに準拠する
- 8. スウィフトOptionSetTypeビットごと、あるいは
- 9. where節でのプロトコルのSwift関連型?
- 10. Swift AnyObject - プロトコルの配列を[AnyObject]にキャストダウン
- 11. アドバンス付きSwiftプロトコルの制限
- 12. UIViewControllerのpresent()関数のSwiftプロトコル
- 13. SwiftでValidIndexCollectionプロトコルを作成する3
- 14. SwiftクラスでのObjective-Cプロトコルの実装
- 15. プロトコル準拠タイプ間のSwiftでのマッピング
- 16. Swiftプロトコルを実装する場所は?
- 17. Swiftでプロトコルを使用する
- 18. Swift:プロトコルと委任パターンについて
- 19. Swift 3アップグレードのプロトコルを廃止する
- 20. カスタムコンポーネントのSwiftでのプロトコル指向プログラミング
- 21. OptionSetTypeから複数のケースにマッチするスイッチ
- 22. Swiftクラスのジェネリックスでプロトコルの配列を使用する
- 23. Swift:クラス内でプロトコル初期化を実装する
- 24. swift 3.0 - UITextFieldDelegateプロトコルの拡張機能が動作しない
- 25. 自己がサブクラスであるSwiftプロトコル拡張
- 26. Objective-Cプロパティゲッターを使用したSwiftプロトコルの実装
- 27. Swiftプロトコル拡張 `var {get}`オーバーライド実装の `let`
- 28. Swift 2 - 2つのUICollectionViewControllers間のプロトコルの委任
- 29. ノンクラスのタイプにswiftプロトコル 'weak'を適用できません
- 30. Swift:プロトコルを使用してプライベートクラスインスタンスを作成する