# iOS 스터디 Part2 Set

{% hint style="info" %}
Advanced Swift (by Chris Eidhof) 책을 번역 후 참고하여 작성하였습니다.
{% endhint %}

* [특징](#.)
* [Protocols](#protocols.)

## 특징.

* Hash Table로 구현되어 있기 때문에(순서가 없는 Hashable한 값들의 유일한 집합) 값을 검색하는 것은 기본적으로 상수 시간 O(1)입니다.
* iterator이기 때문에 loop, filter, map 연산 가능

  단, 순서보장이 안되므로

  \
  1\. 정렬이 필요할 경우: `sorted()` 함수 사용

  ```swift
  let sortedSet = originSet.sorted()
  ```

  \
  2\. 원본 순서가 필요할 경우: 클로저 사용하여 Sequence extension 선언

  ```swift
  extension Sequence where Element: Hashable { 
  	func unique() -> [Element] {
  		let seen: Set<Element> = [] 
  		return !lter { element in
  			if seen.contains(element) { 
  				return false
  			} else{ 
  				seen.insert(element) return true
  			}
  		}
  	} 
  }
  ```

## Protocols.

* ExpressibleByArrayLiteral: 배열 초기화

  ```swift
  let singleDigitNumbers: Set = [1,2,3]
  ```

* SetAlgebra: 집합 연산

  ```swift
  // 차집합
  let iPods: Set = ["iPod touch", "iPod nano", "iPod mini", "iPod shuf!e", "iPod classic"]
  let discontinuedIPods: Set = ["iPod mini", "iPod classic", "iPod nano", "iPod shuf!e"]
  let currentIPods = iPods.subtracting(discontinuedIPods) // ["iPod touch"]

  // 교집합
  let touchscreen: Set = ["iPhone", "iPad", "iPod touch", "iPod nano"] 
  let iPodsWithTouch = iPods.intersection(touchscreen)
  // ["iPod nano", "iPod touch"]

  // 합집합
  var discontinued: Set = ["iBook", "PowerBook", "Power Mac"]
  let unionIPods = discontinued.formUnion(discontinuedIPods) // ["iPod classic", "Power Mac", "iPod nano", "iPod shuf!e", "iBook", "iPod mini", "PowerBook"]
  ```

## Next Steps.

`Set`, `Dictionary`는 기본적으로 `Hash Table`를 사용하기 때문에 해당 개념을 정리하고 다른 Collection 유형과 비교해볼 예정이다.
