develop
OptionSet 본문
반응형
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