공부/SWIFT

[SWIFT] 컬렉션형 - 딕셔너리(Dictionary)

알로하리미 2021. 3. 9. 13:40
728x90

1. 개요

- 요소들이 순서없이 키와 값의 쌍으로 구성되는 타입
- 내부에 없는 키로 접근해도 오류 발생안함 nil을 반환
- 키가 하나이거나 여러개일수 있음
- 키는 유일한 식별자여야함. 중복 불가
- let으로 선언하면 변경 불가
- var로 선언하면 변경 가능
- 이니셜라이저 또는 리터럴 문법을 통해 생성
- isEmpty 프로퍼티를 통해 빈 딕셔너리인지 확인가능
- count 프로퍼티로 딕셔너리 요소 개수 파악 가능

 

 

2. 선언

Swift의 모든 기본 유형을 포함 하여 Hashable프로토콜 을 준수하는 모든 유형을 사전 Key유형 으로 사용할 수 있습니다

//HTTP 응답 코드 및 관련 메시지 사전
var responseMessages = [200: "OK",
                        403: "Access forbidden",
                        404: "File not found",
                        500: "Internal server error"]
                        
//키-값 쌍이없는 사전을 만들려면 빈 사전 리터럴 ( [:])을 사용
var emptyDict: [String: String] = [:]

 

3. 딕셔너리 값 접근 및 값 할당

사전의 값에 액세스하는 가장 일반적인 방법은 키를 첨자로 사용하는 것

print(responseMessages[200])
// Prints "Optional("OK")"

위처럼 Optional로 값이 반환됨 왜냐하면 해당 키에 대한 값을 보유하지 않을 수 있기 때문.

 

예제) 사전에 존재하는 두 개의 키와 그렇지 않은 키가 있는 사전 의 키 기반 첨자를 사용

let httpResponseCodes = [200, 403, 301]
for code in httpResponseCodes {
    if let message = responseMessages[code] {
        //존재 할때
        print("Response \(code): \(message)")
    } else {
        //존재 하지 않을때
        print("Unknown response \(code)")
    }
}
// Prints "Response 200: OK"
// Prints "Response 403: Access forbidden"
// Prints "Unknown response 301"

 

키를 통해서 값을 수정 또는 제거할수 있다.

responseMessages[301] = "Moved permanently"
print(responseMessages[301])
// Prints "Optional("Moved permanently")"

responseMessages[404] = "Not found" //404코드 값을 단순히 "Not found"으로 업데이트
responseMessages[500] = nil //500완전히 제거
print(responseMessages)
// Prints "[301: "Moved permanently", 200: "OK", 403: "Access forbidden", 404: "Not found"]"

 

예제) 문자열 키와 정수 배열 인 값을 사용하여 딕셔너리를 선언 한 다음 각 배열을 내림차순으로 정렬

var interestingNumbers = ["primes": [2, 3, 5, 7, 11, 13, 17],
                          "triangular": [1, 3, 6, 10, 15, 21, 28],
                          "hexagonal": [1, 6, 15, 28, 45, 66, 91]]
for key in interestingNumbers.keys {
    interestingNumbers[key]?.sort(by: >)
}

print(interestingNumbers["primes"]!)
// Prints "[17, 13, 11, 7, 5, 3, 2]"

 

예제) for- in루프를 사용하여 key , value 에 접근

let imagePaths = ["star": "/glyphs/star.png",
                  "portrait": "/images/content/portrait.jpg",
                  "spacer": "/images/shared/spacer.gif"]

for (name, path) in imagePaths {
    print("The path to '\(name)' is '\(path)'.")
}
// Prints "The path to 'star' is '/glyphs/star.png'."
// Prints "The path to 'portrait' is '/images/content/portrait.jpg'."
// Prints "The path to 'spacer' is '/images/shared/spacer.gif'."

 

예제) 디렉토리에 경로가 포함되어 있는지 확인

//imagePaths 딕셔너리에 접두사 /glyphs가 있는 처음으로 걸린 인덱스를 반환
let glyphIndex = imagePaths.firstIndex(where: { $0.value.hasPrefix("/glyphs") })

if let index = glyphIndex {
    //인덱스가 존재한다면
    print("The '\(imagePaths[index].key)' image is a glyph.")
} else {
    //인덱스가 없다면
    print("No glyphs found!")
}
// Prints "The 'star' image is a glyph.")

//키 기반 [key]와 달리 
//인덱스 기반 [index]는 해당 키-값 쌍을 비 선택적 튜플로 반환
print(imagePaths[glyphIndex!])
// Prints "(key: "star", value: "/glyphs/star.png")"