-
[Swift] Set(집합)이라는 컬렉션앱등이에게 살충제를 뿌린다./Swift 2015. 11. 11. 23:19
<선후배간의 정이 돈독해지는 집합시간>
집합(Set)은 배열과 유사합니다.
같은 타입의 서로 다른 값을 저장하지만 순서가 보장되지 않습니다. 배열은 같은 값이 중복되어 포함될 수 있고 순서또한 있다는 차이점이 있습니다.
집합은 Hash값을 이용하여 데이터를 저장하기 때문에 저장되는 데이터는 Hash연산을 할 수 있는 데이터여야 합니다.
스위프트의 기본 데이터타입들은 모두 Hash를 지원하지만 커스텀 타입의 데이터 타입은 스위프트 라이브러리에서 제공하는 Hashable프로토콜을 구현해주어야 합니다. 어쨋든 되긴 되나보네요.
집합을 정의하는 방법은 아래와 같습니다.
배열과 같은 데이터 타입으로 초기화되고 있지만 Set이라는 Type annotation을 사용하여 집합이라는 것을 명시해 주었습니다.
명시해주지 않는다면 genres는 배열 타입으로 간주됩니다.
초기 값으로 빈 Set을 만들고 싶다면 아래와 같이 작성되어야 합니다.
이 형식대로 선언하여 값을 저장하려면 아래와같이 insert메소드를 사용해주면 됩니다.
이렇게 3개의 데이터가 Set에 저장되었습니다.
Set이 비었는지는 isEmpty메소드를 통해 확인할 수 있습니다.
실행결과 : Set has 3 data
for in 구문을 통해 순회탐색을 할 수 있습니다.
실행결과 : Rock Balad Claasic
Set구문은 순서가 정해져있지 않지만 sort메소드를 통해서 정렬된 결과를 얻을 수 있습니다.
실행결과 : Balad Classic Rock
집합의 추가와 삭제
insert메소드와 remove메소드를 통해서 데이터를 동적으로 추가하거나 삭제할 수 있습니다.
원래 Set에 Jazz라는 데이터가 없었기 때문에 1번째 줄에서 입력이 되었습니다. 하지만 Rock이라는 데이터는 원래 존재했기 때문에 2,3번 줄의 코드에서는 아무런 일도 일어나지 않습니다.
remove메소드는 삭제할 데이터를 파라미터로 받아 Set에서 해당 데이터를 삭제합니다. Set을 탐색하여 데이터가 존재하면 데이터를 삭제하고 삭제한 데이터를 리턴합니다. 하지만 삭제할 데이터를 찾지 못하면 아무런 일도 일어나지 않고 nil을 리턴하게 됩니다.
실행결과 : Rock was removed.
removeAll메소드를 통해 모든 데이터를 삭제할 수도 있습니다.
contains메소드를 통해 특정 데이터가 Set에 존재하는지 알아볼 수도 있습니다.
집합 연산
너무 지겹도록 봤던 벤다이어그램입니다. 수학공부의 시작과 끝. 집합이었으니까요
이 집합 연산 외에도 두 집합의 관계에 대해서도 알려주는 메소드가 있습니다. 부분집합 관계에대해서 말이죠.
isSubsetOf(_:) : 집합이 파라미터의 부분집합인지 True, False로 리턴
isSupersetOf(_:) : 집합이 파라미터의 상위집합인지 True, False로 리턴
isStrictSubsetOf(_:) : 집합이 파라미터의 부분집합인지 True, False로 리턴. 단, 파라미터와 같은 집합일 경우 False리턴
isStrictSupersetOf(_:) : 집합이 파라미터의 상위집합인지 True, False로 리턴. 단, 파라미터와 같은 집합일 경우 False리턴
isDisjointWith(_:) : 집합이 파라미터와 교집합이 없을 때 True를 리턴. 교집합이 있으면 False를 리턴.
출처 : 꼼꼼한 재은씨의 Swift2 프로그래밍
'앱등이에게 살충제를 뿌린다. > Swift' 카테고리의 다른 글
[Swift] static 함수와 class 함수! static func vs class func (7) 2016.07.20 [Swift] String의 subString을 subscript로 구현해보자. (0) 2016.05.01 [Swift] Objective-C 오픈소스(AFNetworking 2.0)를 Swift에 적용시켜보자 (0) 2016.03.21 [Swift] 타입 캐스팅 (0) 2015.12.22 [Swift] guard가 if보다 나은 이유? (2) 2015.11.10