develop

OptionSet 본문

iOS

OptionSet

pikachu987 2021. 1. 15. 14:39
반응형

OptionSet은 enum과 비슷하지만 차이점이 둘 이상을 결합할 수 있다.

코드를 짤때 자주 OptionSet을 사용을 하는데 예를들어 UIBezierPath나 String의 range메서드에서 볼수 있다.

 

UIBezierPath의 생성자중

init(roundedRect: CGRect, byRoundingCorners: UIRectCorner, cornerRadii: CGSize)

생성자가 있는데 byRoundingCorners를 받는다.

UIBezierPath(
	roundedRect: .zero, 
	byRoundingCorners: UIRectCorner.topLeft, 
	cornerRadii: CGSize(width: 1.0, height: 1.0))

topLeft, topRight, bottomLeft, bottomRight, allCorners중 하나를 받는데

UIBezierPath(
	roundedRect: .zero, 
	byRoundingCorners: [
		UIRectCorner.topLeft, 
		UIRectCorner.topRight, 
		UIRectCorner.bottomLeft], 
	cornerRadii: CGSize(width: 1.0, height: 1.0))

이렇게 결합할수 있다.

 

UIRectCorner를 확인해보면

public struct UIRectCorner : OptionSet {

    public init(rawValue: UInt)


    public static var topLeft: UIRectCorner { get }

    public static var topRight: UIRectCorner { get }

    public static var bottomLeft: UIRectCorner { get }

    public static var bottomRight: UIRectCorner { get }

    public static var allCorners: UIRectCorner { get }
}

이렇게 OptionSet으로 되어있다.

 

String의 range메서드중 range(of:options:)에 options도 OptionSet으로 되어있다.

public struct CompareOptions : OptionSet {

    public init(rawValue: UInt)


    public static var caseInsensitive: NSString.CompareOptions { get }

    public static var literal: NSString.CompareOptions { get }

    public static var backwards: NSString.CompareOptions { get }

    public static var anchored: NSString.CompareOptions { get }

    public static var numeric: NSString.CompareOptions { get }

    @available(iOS 2.0, *)
    public static var diacriticInsensitive: NSString.CompareOptions { get }

    @available(iOS 2.0, *)
    public static var widthInsensitive: NSString.CompareOptions { get }

    @available(iOS 2.0, *)
    public static var forcedOrdering: NSString.CompareOptions { get }

    @available(iOS 3.2, *)
    public static var regularExpression: NSString.CompareOptions { get }
}

그렇기 때문에

let example = "example"
let range = example.range(of: "am", options: [.caseInsensitive, .backwards])

과 같은 결합으로 여러 옵션을 쓸수 있다.

 

OptionSet을 만드는거는 간단하게 struct에 OptionSet을 붙이면 된다.

Apple에 설명되어 있는 예제를 보면 https://developer.apple.com/documentation/swift/optionset

struct ShippingOptions: OptionSet {
    let rawValue: Int

    static let nextDay    = ShippingOptions(rawValue: 1 << 0)
    static let secondDay  = ShippingOptions(rawValue: 1 << 1)
    static let priority   = ShippingOptions(rawValue: 1 << 2)
    static let standard   = ShippingOptions(rawValue: 1 << 3)

    static let express: ShippingOptions = [.nextDay, .secondDay]
    static let all: ShippingOptions = [.express, .priority, .standard]
}

이렇게 되어있다. 원시값은 1, 2, 4, 8, 16 등 2의 x제곱으로 하게 되어있다.

 

struct Direct: OptionSet {
    let rawValue: Int

    static let horizontal = Direct(rawValue: 1 << 0)
    static let vertical = Direct(rawValue: 1 << 1)
}
let horizontalDirect: Direct = Direct.horizontal
let verticalDirect: Direct = Direct.vertical
let allDirect: Direct = [Direct.horizontal, Direct.vertical]

이렇게 OptionSet을 사용할 수 있다.

반응형

'iOS' 카테고리의 다른 글

final Keyword  (0) 2021.01.17
Standard Library Protocol  (0) 2021.01.16
AccessControl 접근 한정자  (0) 2021.01.14
where Keyword (for의 where, switch 의 where, extension의 where, func의 where)  (0) 2021.01.13
Higher Order Functions 고차함수  (0) 2021.01.12
Comments