ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift) 집합 (Set)
    Swift 2019. 5. 18. 15:31
    728x90

    집합(Set)

    Set 형태로 저장되기 위해서는 반드시 타입이 hashable이어야만 합니다. Swift에서 String, Int, Double, Bool 같은 기본 타입은 기본적으로 hashable입니다. Swift에서 Set 타입은 Set로 선언합니다.

    스위프트에서 집합은 순서가 없는 중복되지 않는 값들의 컬렉션입니다. 딕셔너리처럼 집합에 포함된 값들에는 특정한 순서가 없으며 딕셔너리의 키(Key)처럼 집합은 중복된 값을 포함할 수 없습니다.

     

    어떨때 Set을 쓸까?
    컬렉션에 들어가는 값이 중복인지 아닌지에 따라 배열을 쓸 지 집합을 쓸 지 결정할 수 있다. 문자열을 컬렉션으로 관리한다고 할 때

    • 중복된 문자열 o = Array
    • 중복된 문자열 x = Set

    스위프트의 다른 컬렉션 타입들과 마찬가지로 집합도 강한 타입 제약을 받습니다. 집합에는 지정된 한 가지 특정 타입의 값들만 담을 수 있다는 뜻입니다.

    어떻게 보면 활용면에서의 제약으로 볼 수 있지만 실제로는 의도하지 않은 타입의 값을 넣어서 발생할 수 있는 버그와 문제들을 방지해 줍니다.

    빈 Set 생성

    var letters = Set<Character>()
    print("letters is of type Set<Character> with \(letters.count) items.")
    // letters is of type Set<Character> with 0 items.
    letters.insert("a")
    letters = []

    배열 리터럴을 이용한 Set 생성

    var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]

    Swift의 타입추론으로 아래와 같이 선언도 가능합니다.

    var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

    Set의 접근과 변경

    print("I have \(favoriteGenres.count) favorite music genres.")
    // I have 3 favorite music genres.

    비었는지 확인

    if favoriteGenres.isEmpty {
        print("As far as music goes, I'm not picky.")
    } else {
        print("I have particular music preferences.")
    }
    // I have particular preferences.

    추가

    favoriteGenres.insert("Jazz")
    favoriteGenres.insert("a")
    favoriteGenres.insert("b")
    // Set은 특정한 순서가 없어서 매 번 출력시마다 순서가 변한다.

    삭제

    if let removedGenre = favoriteGenres.remove("Rock") {
        print("\(removedGenre)? I'm over it.")
    } else {
        print("I never much cared for that.")
    }
    // Rock? I'm over it.

    값 확인

    if favoriteGenres.contains("Funk") {
        print("I get up on the good foot.")
    } else {
        print("It's too funky in here.")
    }
    // It's too funky in here.

    Set의 순회

    for-in loop을 이용해 set을 순회할 수 있습니다.

    for genre in favoriteGenres {
        print("\(genre)")
    }
    // Classical
    // Hip hop
    // Jazz

    Set 명령

    Set 명령

    let oddDigits: Set = [1, 3, 5, 7, 9]
    let evenDigits: Set = [0, 2, 4, 6, 8]
    let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
    
    oddDigits.union(evenDigits).sorted()
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    oddDigits.intersection(evenDigits).sorted()
    // []
    oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
    // [1, 9]
    oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
    // [1, 2, 9]

    Set의 맴버십과 동등 비교

    Set의 동등비교와 맴버 여부를 확인하기 위해 각각 == 연산자와 isSuperset(of:), isStrictSubset(of:), isStrictSuperset(of:), isDisjoint(with:) 매소드를 사용한다.

    Set의 맴버십과 동등비교


    isDisjoint(with:)는 둘간의 공통값이 없는 경우에 참을 반환 합니다.

    let houseAnimals: Set = ["🐶", "🐱"]
    let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
    let cityAnimals: Set = ["🐦", "🐭"]
    
    houseAnimals.isSubset(of: farmAnimals)
    // 참
    farmAnimals.isSuperset(of: houseAnimals)
    // 참
    farmAnimals.isDisjoint(with: cityAnimals)
    // 참

    참고
    Swift document(한국어) - 콜렉션 타입

    outofbedlam.github.io

    'Swift' 카테고리의 다른 글

    KVO(Key-Value-Observing)  (0) 2019.09.20
    Swift) 배열의 중복체크  (0) 2019.07.25
    Swift) 소수점 다루기  (0) 2019.07.22
    Swift) 스위프트에서 '모든 것은 객체다'  (1) 2019.07.02
    열거형 (Enumerations)  (0) 2019.06.26

    댓글

Designed by Tistory.