[Swift] UIAccessibilityTraits 초기화가 이상한데요? (feat. OptionSet에 대하여)

왜 단일 값으로도 생성되고, array로도 생성되시는지..???

naljin
4 min readJun 9, 2021

기존 상황

UIView extension에 accessibilityTraits 를 설정해주는 함수가 있다고 해봅시다

func setAccessibility(traits: UIAccessibilityTraits) {
self.accessibilityTraits = traits
}

저는 요런식으로 쓰고 있었구요

view.setAccessibility(traits: .button)

추가 요구 사항

그러다가 trait를 여러개 넘기고 싶은거예요..? 흠.. 여러개 넘기려면..

func setAccessibility(traits: UIAccessibilityTraits...)

요런식으로 parameter를 variadic parameter 로 바꿔야하나..? 하고 고민을 했쥬

어쩌다 마주친 Build Succeeded

그러다가 그냥 Array 형식으로 한번 넘겨봤어요!

view.setAccessibility(traits: [.button, .selected])

음 컴파일 에러나 나겠지~~ 하고 기다리고 있었는데.. 결과는?!

??????????? 혼란… 단일 값도 넘길 수 있고, 어레이도 넘길 수 있다고요????

머 이ㄸㅏ위 문법이 다있어..!!! 쉬익 쉬익거리면서 UIAccessibilityTraits 들어가봤쥬?

흠 뭔가 Set을 보아하니 이거랑 관련 되어있을거 같네요. 그럼 애플 문서 ㄱㄱ

OptionSet (protocol)

bitset 타입을 위한 set interface라는데.. 일단 ㅇㅋㅇㅋ.. 넘어가고 제가 원하는 정보는 밑에 있었어요

Using an Option Set Type

OptionSet의 인스턴스는 생성할 수 있는 방법은 여러개임 ㅇㅇ

  1. OptionSet의 static 멤버 중 하나를 할당
let singleOption: ShippingOptions = .priority

2. OptionSet의 static 멤버가 여러개인 Array Literal 할당

let multipleOptions: ShippingOptions = [.nextDay, .secondDay, .priority]

3. Empty Array Literal 할당

let noOptions: ShippingOptions = []

대박적.. 대박적.. 애초에 문법이 이래서 인자를 다른 형식으로 넘겨도 에러가 안났던거였군여

view.setAccessibility(traits: .button)
view.setAccessibility(traits: [.button, .selected])

추가로 기본적으로 얘는 set이기 때문에 contains, insert, remove 등의 작업을 할 수 있습니다!

그렇기 때문에 요렇게 단일 값으로 초기화 되었어도, insert 할 수 있단 말씀~

var freeOptions: ShippingOptions = .nextDay
freeOptions.insert(.priority)

마무리

크크.. UIAccessibilityTraits 가 복수형인데는 다 이유가 있었던거임…?! 얘 자체가 일종의 Set 이었던 것임..

그럼 급한 마무리.. 안녕!

참고

--

--