2016-06-29 5 views

答えて

3

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.

2

OptionSetTypeは、あなたのクラスがRawRepresentableであり、その生の表現がBitwiseOperationsTypeであると仮定すると、あなたのクラスは何かを実装せずSetAlgebraTypeに適合させることができます。これは、nine methodsのデフォルトの実装をSetAlgebraTypeにすることで実現します。

Setとの主な違いとの違いは、さまざまなタイプのものに何も書き込む必要がないことです。積分型。あなたの生表現可能な型をOptionSetTypeに適合させるだけで、すべての実装を無料で手に入れることができます。

2

の質素な哲学と比較に収まりますセットはではなく、セットです。値がビットマスクである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) 
関連する問題