2016-06-29 4 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 열거 형입니다. 개념은 Swift에 이러한 열거 형을 가져 오는 방법을 제공하여 Set와 같은 편의성과 안전성으로 조작 할 수있는 방법을 제공하지만 실제로는 비트 단위 및 비트 단위를 사용하여 정수를 형성합니다. Objective-C에서 정수를 직접 생성해야합니다. 실제로는 bitwise-or 연산자를 사용합니다. 그러나 스위프트는 그렇게하지 않아도됩니다.

따라서, 당신은 는 말할 수 :

let val = 
    UIViewAnimationOptions.Autoreverse.rawValue | 
    UIViewAnimationOptions.Repeat.rawValue 
let opts = UIViewAnimationOptions(rawValue: val) 

... 그리고 오브젝티브 C에서, 당신은 사실상 그렇게 할 것입니다. 그러나 Swift를 사용하면 대신 다음과 같이 말할 수 있습니다.

var opts = UIViewAnimationOptions.Autoreverse 
opts.insert(.Repeat) 
관련 문제