티스토리 뷰

iOS/Swift-Documents

Swift 5.5 Collection Types -4

malrang-malrang 2022. 1. 27. 01:21

빵쟁이가 ios 개발자가 되기위해 정독하고자 작성한 글 입니다!

표현이 이상하거나 잘못번역된 부분이 있을수 있습니다.

혹 누군가 읽다 잘못된 부분이 있으면 댓글로 알려주세요!

Collection Types

Swift는 값 컬렉션을 저장하기 위해 배열(Array), 집합(Set) 및 사전(Dictionary)으로 알려진 세 가지 기본 컬렉션 타입을 제공합니다.
배열(Array)은 정렬된 값 모음입니다.
집합(Set)은 고유한 값의 정렬되지 않은 컬렉션입니다. (중복값이 허용 되지 않는다.)
사전은(Dictionary) 는 키-값 연관의 정렬되지 않은 컬렉션입니다. (key - value 가 쌍으로 묶여있는 튜플타입!)

Swift의 배열, 집합 및 사전은 저장할 수 있는 값과 키의 타입을 명확하게 해주어야 합니다.
이는 실수로 잘못된 타입의 값을 컬렉션에 삽입할 수 없음을 의미합니다. (어떤 타입의 값을 넣을수 있는지)
또한 컬렉션에서 검색할 값 타입에 대해 확신할 수 있음을 의미합니다. (어떤 타입의 값이 들어있는지)

  Note
  Swift의 배열, 집합 및 사전 유형은 일반 컬렉션으로 구현됩니다. 

Mutability of Collections

배열, 집합 또는 사전을 만들고 변수에 할당하면 생성된 컬렉션이 변경 가능합니다.
즉, 컬렉션의 항목을 추가, 제거 또는 변경하여 컬렉션이 생성된 후 컬렉션의 값을 변경 할 수 있습니다.
배열, 집합 또는 사전을 상수에 할당하면 해당 컬렉션은 변경할 수 없으며 크기와 내용을 변경할 수 없습니다.

  Note
  컬렉션을 변경할 필요가 없는 경우에 변경할 수 없는 컬렉션을 만드는 것이 좋습니다.
  그렇게 하면 코드에 대해 더 쉽게 추론할 수 있고 Swift 컴파일러가 생성한 컬렉션의 성능을 최적화할 수 있습니다.

Arrays (배열)

배열은 정렬된 목록에 같은 타입의 값을 저장합니다.
동일한 값이 배열의 다른 위치에 여러 번 나타날 수 있습니다. (중복값 허용)

  Note
  Foundation을 사용하면 Array 타입이 NsArray클래스에 연결됩니다.
  (NsArray의 메소드나 프로퍼티를 사용할수 있게되는것같다.)

Array Type Shorthand Syntax

Swift 배열의 유형은 전체가 Array로 작성됩니다. 여기서 Element는 배열이 저장할 수 있는 값 유형입니다.
배열의 유형을 [Element]로 축약형으로 작성할 수도 있습니다.
두 형식이 기능적으로 동일하지만 축약 형식이 선호됩니다.

Creating an Empty Array (비어있는 배열 만들기)

초기화 구문을 사용하여 특정 유형의 빈 배열을 만들 수 있습니다.

  var someInts: [Int]()
  print("someInts is of type [Int] with \(someInts.count) items.")
  // Prints "someInts is of type [Int] with 0 items."

someInts 변수의 유형은 초기화 유형에서 [Int]로 유추됩니다.

  someInts.append(3)
  // someInts now contains 1 value of type Int
  someInts = []
  // someInts is now an empty array, but is still of type [Int]

Array 배열에 Elements 값을 추가해주기 위해선 .append() 메서드를 사용할수있으며
someInts는 Int타입의 배열이라고 정의 해주었기 때문에 타입은 작성하지않고 [] 빈배열 리터럴을 사용해 빈배열로 변경 해줄수있다.
이렇게 빈배열로 초기화 해주어도 someInt는 Int값만 넣을수 있는 배열이다.

Creating an Array with a Default Value (기본값있는 배열 만들기)

Swift의 Array 유형은 모든 값이 동일한 기본값으로 설정된 특정 크기의 배열을 생성하기 위한 이니셜라이저도 제공합니다.
이니셜라이저에 적절한 유형의 기본값(repeating)을 전달하고 해당 값이 새 배열에서 반복되는 횟수(count)를 전달합니다.

  var threeDoubles = Array(repeating: 0.0, count: 3)
  // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

threeDoubles의 배열에는 0.0 의값이 3개들어있는 배열로 선언과동시에 정의 해줄수있다.

Creating an Array by Adding Two Arrays Together (두개의 배열 더하기)

더하기 연산자(+)를 사용하여 호환되는 유형의 기존 배열 두 개를 더해서 새 배열을 만들 수 있습니다.
새 배열의 유형은 함께 추가하는 두 배열의 유형에서 유추됩니다.
기존 배열2개가 Int 타입이었다면 배열 두개를 더한 새로운 배열도 Int 값을 저장할수있는 배열임!

  var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
  // anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]

  var sixDoubles = threeDoubles + anotherThreeDoubles
  // sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

Creating an Array with an Array Literal (배열 리터럴로 만들기)

배열 리터럴을 사용하여 배열을 초기화할 수도 있습니다.
이는 하나 이상의 값을 배열 컬렉션으로 쓰는 약식 방법입니다.
배열 리터럴은 대괄호로 묶여있으며 쉼표로 구분한 표현 방식이다.

아래 예제는 문자열 값을 저장하기 위해 shoppingList 라는 배열을 생성합니다:

  var shoppingList: [String] = ["Eggs", "Milk"]
  // shoppingList has been initialized with two initial items

shoppingList 변수는 [String]로 작성되어 "문자열 값의 배열"로 선언됩니다. 이 특정 배열이 String 값 타입을 지정했기 때문에 String 값만 저 장할 수 있습니다. 여기에서 shoppingList 배열은 배열 리터럴 내에 작성된 두 개의 문자열 값("Eggs" 및 "Milk")으로 초기화됩니다.

Swift의 유형 추론 덕분에 동일한 유형의 값을 포함하는 배열 리터럴로 초기화하는 경우 배열 타입을 작성할 필요가 없습니다.
shoppingList 초기화는 대신 더 짧은 형식으로 작성될 수 있습니다.

  var shoppingList = ["Eggs", "Milk"]

배열 리터럴의 모든 값이 동일한 타입이기 때문에 Swift는 값을보고 아 얘는 String 저장하려 하는군 하고 유추 할수있습니다!
따라서 타입 어노테이션 을하지 않아도 된다!

Accessing and Modifying an Array (배열 접근및 수정)

메서드 및 프로퍼티를 통해 배열에 접근하고 수정할수있다.

배열의 항목 갯수를 찾으려면 count 프로퍼티를 사용할수있다. (배열에 몇개들었는지 확인할때 씀!)

  print("The shopping list contains \(shoppingList.count) items.")
  // Prints "The shopping list contains 2 items."

배열의 Elements 가 0인지 아닌지를 확인할때는 isEmpty 프로퍼티를 사용하며 Bool값으로 반환된다! (true. false)
아래예시는 반환된 Bool값을 이용하여 조건문을 사용한 모습.

  if shoppingList.isEmpty {
    print("The shopping list is empty.")
  } else {
    print("The shopping list isn't empty.")
  }
  // Prints "The shopping list isn't empty."

배열의 append(_:) 메서드를 호출하여 배열 끝에 새 항목을 추가할 수 있습니다.

  shoppingList.append("Flour")
  // shoppingList now contains 3 items, and someone is making pancakes

추가 할당 연산자(+=)를 사용하여 하나 이상의 호환 가능한 항목 배열을 추가합니다.
아래예시 처럼하면 값 여러게 한번에 넣어줄수있음!

  shoppingList += ["Baking Powder"]
  // shoppingList now contains 4 items
  shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
  // shoppingList now contains 7 items

Array는 순서가 있는 데이터들의 모임이기 때문에 index로 접근이 가능하다.
Array의 index는 0부터 시작하며 접근할 때는 [index]를 사용하면 된다.

  var firstItem = shoppingList[0]
  // firstItem is equal to "Eggs"
  Note
  배열의 첫 번째 항목은 인덱스가 1이 아니라 0입니다. 
  Swift의 배열은 항상 인덱스가 0부터 시작합니다.

인덱스에서 기존 값을 변경할 수 있습니다.

  shoppingList[0] = "Six eggs"
  // the first item in the list is now equal to "Six eggs" rather than "Eggs"

지정한 인덱스가 유효해야 합니다. 배열 범위 밖을 지정하면 런타임오류 발생!

한번에 여러개의 값도 변경가능하다!

  shoppingList[4...6] = ["Bananas", "Apples"]
  // shoppingList now contains 6 items

4,5,6번인덱스 총 3개의 값을 Banana, Apples 로 변경 하라는 뜻이며 이렇게 되면 Array의 값의 갯수도 1개가 줄어들어 6개가 된걸 확인할수있다.

지정된 인덱스의 배열에 항목을 삽입하려면 배열의 insert(_:at:) 메서드를 호출합니다.

  shoppingList.insert("Maple Syrup", at: 0)
  // shoppingList now contains 7 items
  // "Maple Syrup" is now the first item in the list

insert(_:at:) 메서드에 를 이용해 인덱스 0번에 (맨 처음) "Maple Syrup" 값을 가진 새 항목을 삽입합니다.

마찬가지로 remove(at:) 메서드를 사용하여 배열에서 항목을 제거할수있습니다.
이 메서드는 지정된 인덱스에서 항목을 제거하고 제거된 값을 반환합니다(필요 하지 않은 경우 반환된 값을 무시할 수 있음).
반복문에서 remove 로 index값 지워서 하나하나 빼낼때 사용했었음. 반환 하는거 중요!

  let mapleSyrup = shoppingList.remove(at: 0)
  // the item that was at index 0 has just been removed
  // shoppingList now contains 6 items, and no Maple Syrup
  // the mapleSyrup constant is now equal to the removed "Maple Syrup" string
  Note
  배열의 범위 밖에 있는 인덱스 값에 접근하거나 수정하려고 하면 런타임 오류가 발생합니다.

0번인덱스에 들어있던 "Maple Syrup" 제거되면 배열의 모든 간격이 닫히므로 인덱스 0의 값은 다시 "Six eggs" 가 됩니다.
(비어있는 칸이 생겼으니 Element 들을 한칸 씩 앞으로 다시 땡겨 준다?)

  firstItem = shoppingList[0]
  // firstItem is now equal to "Six eggs"

만약 Array에서 특정 값이 아니고 맨 마지막 값을 삭제하고 싶다면 removeLast() 메서드를 사용하면 된다.
물론 removeLast() 메서드도 제거된 항목을 반환한다.

  let apples = shoppingList.removeLast()
  // the last item in the array has just been removed
  // shoppingList now contains 5 items, and no apples
  // the apples constant is now equal to the removed "Apples" string

Iterating Over an Array (배열 반복)

for-in 루프를 사용하여 배열의 값 하나하나 를 꺼내어 사용할 수 있습니다.

  for item in shoppingList {
    print(item)
  }
  // Six eggs
  // Milk
  // Flour
  // Baking Powder
  // Bananas

enumerated() 메서드를 사용하여 배열의 값 뿐만 아니라 위치 즉 index 가 몇번째인지도 확인할수 있습니다.
enumerated()는 튜플 값을 반환하기 때문에 for 다음에 인덱스 번호와 값 을 작성해주어 사용할수있습니다.
아래 예시 보면 이해가 빠릅니다!

  for (index, value) in shoppingList.enumerated() {
    print("Item \(index + 1): \(value)")
  }
  // Item 1: Six eggs
  // Item 2: Milk
  // Item 3: Flour
  // Item 4: Baking Powder
  // Item 5: Bananas

Sets

Set은 해석하면 집합으로 차집합, 합집합, 교집합 등의 개념을 사용할 수 있다.
Set은정의된 순서 없이 컬렉션에 동일한 유형의 고유한 값을 저장합니다.
항목의 순서가 중요하지 않거나 항목이 한 번만 표시되도록 해야 하는 경우 배열 대신 집합을 사용할 수 있습니다.
(로또 번호 같은거? 만들때 좋음 로또번호 추첨 중에 예를들어 20이라는 숫자가 여러개 있으면 안되잖음? 1개만있어야 하잔아용 이렇게 순서상관없이 중복 된값 없게끔 할때 사용됩니당)

  Note
  Foundation사용하면 Set 타입이 NSSet 클래스에 있는 프로퍼티나 메소드 사용할수 있습니다.

Hash Values for Set Types

Set에 저장되기 위해선 hash 할 수 있어야 한다. 여기서 사용되는 해시 값은 Int형이다. 즉 A와 B가 있을 때 A의 해시 값과 B의 해시 값이 같다면 A 와 B는 같다고 볼 수 있다.
모든 Swift의 기본적인 타입 (String, Int, Double, Bool)은 해시 할 수 있고 set의 값이나 dictionary의 키값이 될 수 있다.

Set Type Syntax

Swift 세트의 유형은 Set로 작성되며, 여기서 Element는 세트가 저장할 수 있는 타입 을 작성합니다.
배열과 달리 set에는 축약 문법이 없습니다.

Creating and Initializing an Empty Set

초기화 구문(생성자)을 사용하여 특정 타입의 빈 set을 만들 수 있습니다.

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

letters에 값이 들어와있기 떄문에 타입을 다시 정해주지 않고 빈배열로 초기화 해줄수있다.
물론 Array와 마찬가지로 Set도 한 번 선언되면 빈 Set을 다시 주더라도 저장되는 타입은 바뀌지 않는다.

  letters.insert("a")
  // letters now contains 1 value of type Character
  letters = []
  // letters is now an empty set, but is still of type Set<Character>

Creating a Set with an Array Literal (배열 리터럴로 Set만들기)

하나 이상의 값을 set 컬렉션에 저장할때는 축약 방법으로 작성할수있디.
배열 리터럴을 사용하여 집합을 초기화할 수도 있습니다.

  var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
  // favoriteGenres has been initialized with three initial items

FavoriteGenres 변수는 Set으로 작성된 "문자열 값의 set"으로 선언됩니다.
String 값 유형을 지정했기 때문에 String 값만 저장할 수 있습니다.
여기에서 FavoriteGenres set는 배열 리터럴 내에서 작성된 세 가지 문자열 값("Rock", "Classical" 및 "Hip hop")을 가진것으로 초기화 됩 니다.

배열 리터럴만으로는 set이라고 유추할 수 없으므로 Set 유형을 명시적으로 선언해야 합니다.
Swift의 유형 추론 을 이용해 리터럴로 초기값을 넣어준다면 어떤 타입이 들어올지 유추할수 있기 때문에 어떤 타입의 값이 들어올지는 생략 해줄수있다.

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

배열 리터럴의 모든 값이 동일한 유형이기 때문에 FavoriteGenresdl 이 Set 일것이라고 유추할 수 있습니다.

Accessing and Modifying a Set (접근 및 수정)

메서드와 프로퍼티를 사용해 set에 접근하고 수정 할수있습니다.

set에 몇개의 값이 저장되어있는지 확인할때는 count 프로퍼티를 사용해 알수있습니다.

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

isEmpty 프로퍼티를 사용해 값이 0인지 확인할수있으며 Bool값으로 반환됩니다.
Array와 마찬가지로 조건문에서 사용이 가능합니다.

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

세트의 insert(_:) 메서드를 호출하여 세트에 새 항목을 추가할 수 있습니다.

  favoriteGenres.insert("Jazz")
  // favoriteGenres now contains 4 items

세트의 remove(_:) 메소드를 호출하여 세트에서 항목을 제거할 수 있습니다.
이 메소드는 set에 명시된 항목을 제거하고 제거된 값을 반환합니다.

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

세트에 특정 항목이 포함되어 있는지 확인하려면 contains(_:) 메소드를 사용하십시오.
Bool 값으로 반환되어 조건문에서 사용가능!

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

Iterating Over a Set (set 반복문 사용)

for-in 루프를 사용하여 Set의 값을 꺼내어 사용 할 수 있습니다.
Swift의 Set 유형에는 정의된 순서가 없습니다.
특정 순서가 있게 만들고 싶다면 sorted() 메서드를 사용합니다.
sorted() 메소드 사용시 set 는 순서를 가질수없기때문에 Array로 반환됩니다.
set->Array 로 바뀜!

Performing Set Operations (집합 연산)

두 set를 함께 결합하거나, 두 set가 공통적으로 갖는 값을 찾거나, 두 set에 동일한 값이 모두 포함되어 있는지, 일부가 포함되어 있는지 또는 전 혀 포함되어 있지 않은지 확인할수 있습니다.

  • Intersection(:) 메서드를 사용하여 두 집합에 공통적인 값만 있는 새 집합을 만듭니다.
  • symmetricDifference(:) 메서드를 사용하여 두 집합 중 하나에 값이 있는 새 집합을 만들 수 있습니다.
  • Union(:) 메서드를 사용하여 두 집합의 모든 값을 사용하여 새 집합을 만듭니다.
  • 지정된 집합에 없는 값을 사용하여 새 집합을 만들려면 subtracting(_:)(:) 메서드를 사용합니다.
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 Membership and Equality

아래 그림은 집합 간에 공유되는 요소를 나타내는 그림입니다.
겹치는 영역이 있는 세 개의 집합(a, b, c)을 보여줍니다.
a집합은 b의 모든 요소를 포함하기 때문에 집합a는 b의 상위 집합입니다.
b의 모든 요소도 a집합에 포함되기 때문에 집합 b는 a집합의 하위 집합입니다.
집합 b와 집합 c는 공통 요소를 공유하지 않기 때문에 서로 연결되어 있지 않습니다.

  • "같음" 연산자(==)를 사용하여 두 집합에 동일한 값이 모두 포함되어 있는지 확인합니다.
  • isSubset(of:) 메서드를 사용하여 집합의 모든 값이 지정된 집합에 포함되어 있는지 확인합니다.
  • isSuperset(of:) 메서드를 사용하여 집합에 지정된 집합의 모든 값이 포함되어 있는지 확인합니다.
  • isStrictSubset(of:) 또는 isStrictSuperset(of:) 메서드를 사용하여 집합이 하위 집합인지 상위 집합인지 확인합니다.
  • isDisjoint(with:) 메서드를 사용하여 두 집합에 공통 값이 없는지 확인합니다.
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]

houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true

Dictionaries

Dictionary 는 Set와 마찬가지로 순서가 없으며 key(키), value(값) 으로 이루어진 튜플타입 컬렉션 입니다.
모든 값(value)들은 중복되지않는 키(key)와 연결 되어있습니다.
값은 중복될수있으나 키는 중복안됩니다!

Note
Foundation 을 사용하면 NSDictionary 의 프로퍼티와 메소드를 사용할수 있습니다.

Dictionary Type Shorthand Syntax

Dictionary는 Dictionary<Key, Value>로 표현된다. 여기서 Key에는 Key 값의 타입, Value에는 Value 값의 타입을 써주면 된다. Dictionary를 [Key : Value] 로 표현할 수도 있다. 물론 두 개의 표현방식은 같은 의미를 가진다.

Note
Dictionary의 키 값 은 set의 값 유형과 같이 Hashable 프로토콜을 준수해야 합니다.

Creating an Empty Dictionary (비어있는 Dictionary 만들기)
배열과 마찬가지로 초기화(생성자) 구문을 사용하여 특정 타입의 비어있는 Dictionary를 만들 수 있습니다.

var namesOfIntegers: [Int: String] = [:]
// namesOfIntegers is an empty [Int: String] dictionary

이 예제에서는 정수 값에 사람의 이름을 저장하기 위해 [Int: String] 유형의 빈 사전을 만듭니다.
키는 Int 타입 이고 값은 String 타입 입니다.

namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String]

위에서 본 Set과 Array와 같이 Dictionary도 한 번 선언되었으면 빈 Dictionary가 된다고 해도 Key와 Value의 타입이 변하지 않는다.
빈 Dictionary는 [:]로 표현할 수 있다.

Creating a Dictionary with a Dictionary Literal (Dictionary 리터럴 사용)

이전에 본 배열 리터럴과 유사한 구문을 가진 사전 리터럴을 사용하여 사전을 초기화할 수도 있습니다. 사전 리터럴은 하나 이상의 키-값 쌍을 사전 컬렉션으로 작성하는 약식 방법입니다.
키-값 쌍은 키와 값의 조합입니다. 사전 리터럴에서 각 키-값 쌍의 키와 값은 콜론으로 구분됩니다.
키-값 대괄호안에 있어야 하며 쉼표로 여러개의 항목을 구분할수있다.

아래 예제는 국제 공항의 이름을 저장하는 사전을 만듭니다.
이 사전에서 키는 세 글자로 된 국제항공운송협회(International Air Transport Association) 코드이고 값은 공항 이름입니다.

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

공항 사전은 [String: String] 유형으로 선언되며, 이는 "키가 문자열 유형이고 값도 문자열 유형인 사전"을 의미합니다.

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

위와 같이 선언하면 2개의 key-value 쌍을 가진 Dictionary가 생성된다.
Dictionary에서도 타입을 써주지 않아도 알아서 Swift가 추론할 수 있게 만들면 오류가 발생되지 않는다.

Accessing and Modifying a Dictionary (Dictionary 접근 및 수정)

메서드 및 프로퍼티를 사용해 Dictionary에 접근 하고 수정할수 있습니다.

배열과 마찬가지로 Count프로퍼티를 사용해 Dictionary가 몇개의 key-value 를 가지고있는지 확인할수있다.

print("The airports dictionary contains \(airports.count) items.")
// Prints "The airports dictionary contains 2 items."

isEmpty 프로퍼티를 사용해 key-value가 0개 인지 확인할수있으며 true,false 로 반환된다.
당연히 조건문에서 사용가능하다.

if airports.isEmpty {
    print("The airports dictionary is empty.")
} else {
    print("The airports dictionary isn't empty.")
}
// Prints "The airports dictionary isn't empty."

Dictionary에 새로운 값을 추가하고 싶다면 Key, Value 값을 모두 적어 추가할 수 있는데 추가 방법은 아래 코드와 같다.

airports["LHR"] = "London"
// the airports dictionary now contains 3 items

물론 같은 방법으로 이미 존재하는 Key의 Value 값을 수정할 수도 있다.

airports["LHR"] = "London Heathrow"
// the value for "LHR" has been changed to "London Heathrow"

수정할 때 위의 방법 말고도 Dictionary의 updateValue(:forKey:)로 수정할 수도 있다.
만약 이 메서드를 사용할 때 없는 Key에 대한 Value를 수정하려고 하면 수정이 아닌 생성을 하게 된다.
updateValue(
:forKey:) 메서드는 기존의 Value 값을 반환해 준다. 이때 반환되는 값은 옵셔널 값으로 반환된다.
즉 만약 String 값을 저장해뒀다면 String? 혹은 optional(String) 값을 반환한다.

if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("The old value for DUB was \(oldValue).")
}
// Prints "The old value for DUB was Dublin."

Dictionary에서 특정한 Key 값에 접근할 때 Key 값이 존재하지 않을 수 있기 때문에 늘 옵셔널 값으로 결과를 준다.
즉 존재하지 않는 Key 값에 접근하면 nil을 반환시켜주는 것이다.
이렇기 때문에 옵셔널 바인딩을 활용해서 Value 값을 추출해 줘야 한다.

if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport isn't in the airports dictionary.")
}
// Prints "The name of the airport is Dublin Airport."

해당 키에 nil 값을 할당하여 사전에서 키-값 쌍을 제거할 수 있습니다.

airports["APL"] = "Apple International"
// "Apple International" isn't the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary

removeValue(forKey:) 메소드를 사용하여 사전에서 키-값 쌍을 제거 할수있다.
이 메서드는 키-값 쌍이 있으면 제거하고 제거된 값을 반환하거나 값이 없으면 nil을 반환합니다.

if let removedValue = airports.removeValue(forKey: "DUB") {
    print("The removed airport's name is \(removedValue).")
} else {
    print("The airports dictionary doesn't contain a value for DUB.")
}
// Prints "The removed airport's name is Dublin Airport."

Iterating Over a Dictionary

for-in 루프를 사용하여 Dictionary에 저장된 키-값 을 하나씩 꺼내 사용할수 있습니다.
Dictionary의 각 항목은 (키, 값) 튜플로 반환되며 튜플의 구성원을 상수 또는 변수에 넣어 사용할수 있습니다.

for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// LHR: London Heathrow
// YYZ: Toronto Pearson

Dictionary의 keys, values 프로퍼티로 각각 접근하여 사용할수있다.
반복문을 사용해 키에 해당된 값들을 검색할 수도 있습니다.

for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
// Airport code: LHR
// Airport code: YYZ

for airportName in airports.values {
    print("Airport name: \(airportName)")
}
// Airport name: London Heathrow
// Airport name: Toronto Pearson

만약 Dictionary의 Key, Value 값을 각각 저장하고 싶다면 새로운 Array를 만들면 된다.

let airportCodes = [String](airports.keys)
// airportCodes is ["LHR", "YYZ"]

let airportNames = [String](airports.values)
// airportNames is ["London Heathrow", "Toronto Pearson"]

Swift의 Dictionary는 순서가 없기 때문에 만약 Key, Value 값들을 적절히 정렬하고 싶다면 sorted() 메서드를 사용하면 정렬 가능하다.

'iOS > Swift-Documents' 카테고리의 다른 글

Swift 5.5 Functions -6  (0) 2022.02.04
Swift 5.5 Control Flow -5  (0) 2022.01.27
Swift 5.5 Strings and Characters -3  (0) 2022.01.25
swift5.5 공식문서 Basic Operators -2  (0) 2022.01.23
swift5.5 공식문서 The Basics -1  (0) 2022.01.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함