2015년 8월 25일 화요일

Swift 2.0 - OptionSetType

OptionSetType은 기존의 비트 단위 옵션셋을 대체하기 위해 등장한 프로토콜이다. enum이나 #define을 쓰던 때와는 다르게 struct 기반의 옵션셋 구현을 가능하게 해 준다.

C 스타일 예제

C라곤 했지만 Objective-C도 해당되는 거긴 하다.
typedef enum _my_option {
    MyOptionInit = 0x0,
    MyOptionGood = 0x1,
    MyOptionBad = 0x1 << 1;
} MyOption;

MyOption option = MyOptionGood | MyOptionBad;

if (option == MyOptionInit) {
    NSLog(@"INIT");
}
if (option & MyOptionGood) {
    NSLog(@"GOOD");
}
if (option & MyOptionBad) {
    NSLog(@"BAD");
}
비트의 OR연산을 이용해 하나의 단위 변수에 여러 옵션을 박아 넣는 방식의 C식 예제이다. 아마도 Objective-C를 사용해 왔다면 종종 사용하던 옵션플래그 제작 방식일 것이다.

OptionSetType

위 예제를 Swift 2.0 코드로 옮겨보면서 OptionSetType 프로토콜을 준수하는 형태로 바꾸어보자.
struct MyOption: OptionSetType {
    let rawValue: Int
    
    static let Init = MyOption(rawValue: 0)
    static let Good = MyOption(rawValue: 1)
    static let Bad = MyOption(rawValue: 2)
}

// .Init과 .Good 두개를 옵션으로 사용
let option: MyOption = [.Init, .Good]

// 옵션이 들어있는지 확인
option.contains(.Init)    // true
option.contains(.Bad)     // false
중요한 내용은 전부 나온 것 같다. 보다싶이, 배열도 아닌것이 배열 비슷한 문법으로 기존의 enum을 대체할 수 있게 만들어졌다.

Xcode 7 에서는 기존의 UIKit이나 AppKit의 enum 옵션셋(Bitwise OR을 사용해 조합하는) 타입이 거의 대부분 이 OptionSetType 형식으로 바꾼 것 같다. 따라서 이 변화를 미리 알아두는 편이 좋을 것이다.

[관련글] Swift 2.0 - 그 외 사소한(?) 변화들
[관련글] 스위프트(Swift) 가이드

댓글 없음 :