λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/Swift

[Swift] Collection Type - λ”•μ…”λ„ˆλ¦¬(Dictionary), 반볡문, key/value 기반 μ •λ ¬

by Danna 2021. 5. 31.
728x90
728x90

μ•ˆλ…•ν•˜μ„Έμš”! 이번 ν¬μŠ€νŒ…μ€ Swift 데이터ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜ μ±…μ˜ 2μž₯ μŠ€ν„°λ”” μ€‘ λ‘λ²ˆμ§Έ 핡심 λ‚΄μš©μΈ Collection Type 에 λŒ€ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. Array (λ°°μ—΄), Dictionary (λ”•μ…”λ„ˆλ¦¬, μ‚¬μ „ν˜•), Set (μ„ΈνŠΈ), Tuple(νŠœν”Œ) 넀가지 νƒ€μž…μ— λŒ€ν•΄ ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€.


 

πŸ“– λ”•μ…”λ„ˆλ¦¬(Dictionary; μ‚¬μ „ν˜•)

λ”•μ…”λ„ˆλ¦¬λŠ” λ™μΌν•œ 데이터 νƒ€μž…μ΄ Key: Value 쌍으둜 묢인 μˆœμ„œκ°€ μ—†λŠ” μ»¬λ ‰μ…˜(Unordered Collection)μž…λ‹ˆλ‹€. Value λŠ” μ‹€μ œλ‘œ λ‹΄κ³  μžˆλŠ” κ°’, Key λŠ” ν•΄λ‹Ή κ°’μ˜ μ΄λ¦„ν‘œ(μ‹λ³„μž, Identifier)와 같은 역할을 ν•©λ‹ˆλ‹€. Key λ₯Ό 톡해 Value λ₯Ό κ°€μ Έμ˜€λŠ” κ²ƒμ΄μ§€μš”! λ”•μ…”λ„ˆλ¦¬μ˜ 데이터 κ΅¬μ‘°λŠ” μ΄λ¦„μ—μ„œλ„ λ‚˜νƒ€λ‚˜λ“―μ΄ 사전과 μœ μ‚¬ν•œ 데이터 νƒ€μž…μΈλ°μš”. μ‚¬μ „μ—μ„œ μ°ΎλŠ” 단어가 Key κ³  λ‹¨μ–΄μ˜ 뜻이 Value 이닀 μƒκ°ν•˜λ©΄ 될 것 κ°™μ•„μš”!

 

참고둜, Dictionary 의 Key νƒ€μž…μ€ Hashable ν”„λ‘œν† μ½œμ— λΆ€ν•©ν•΄μ•Ό ν•©λ‹ˆλ‹€. Hashable νƒ€μž…μ€ μœ μΌν•˜κ²Œ ν‘œν˜„ κ°€λŠ₯ν•œ 값을 μ œκ³΅ν•˜λŠ” νƒ€μž…μœΌλ‘œ, 검색이 μš©μ΄ν•©λ‹ˆλ‹€. 데이터ꡬ쑰에 μˆœμ„œκ°€ μ—†κΈ° λ•Œλ¬Έμ— hashable ν•œ νƒ€μž…μ΄μ–΄μ•Ό μ›μ†Œλ₯Ό λΉ λ₯΄κ²Œ 찾을 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. Swift 의 λͺ¨λ“  κΈ°λ³Έ νƒ€μž…(Int, Double ... enumeration)은 Hashable ν”„λ‘œν† μ½œμ„ λ”°λ₯΄κΈ° λ•Œλ¬Έμ—, κΈ°λ³Έ νƒ€μž…μœΌλ‘œ λ”•μ…”λ„ˆλ¦¬λ₯Ό κ΅¬μ„±μ‹œμ—λŠ” 크게 신경쓰지 μ•Šμ•„λ„ 될 것 κ°™μŠ΅λ‹ˆλ‹€! μžμ„Έν•œ λ‚΄μš©μ€ 2μž₯ μš”μ•½μ„ ν™•μΈν•΄μ£Όμ„Έμš”

 

βœ”οΈŽ Dictionary μ΄ˆκΈ°ν™”

  • λΉ„μ–΄μžˆλŠ” λ”•μ…”λ„ˆλ¦¬ μ„ μ–Έ 방법
  • μ΄ˆκΈ°ν™”μ‹œ Key : Value μŒμ„ μ£ΌλŠ” λ”•μ…”λ„ˆλ¦¬ μ„ μ–Έ 방법 
  • Swift μ—μ„œ μžλ£Œν˜•μ„ μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ μœ μΆ”ν•˜μ—¬ μ§€μ •λ˜μ§€λ§Œ, λͺ…μ‹œν•΄μ£ΌλŠ” 게 더 쒋은 것 κ°™μŠ΅λ‹ˆλ‹€!
// λΉ„μ–΄μžˆλŠ” λ”•μ…”λ„ˆλ¦¬ μ„ μ–Έ 방법
var dict1 = Dictionary<Int, String>()
var dict2 = [Int: String]()
var dict3: [Int: String] = [:]

// μ΄ˆκΈ°ν™”μ‹œ Key : Value μŒμ„ μ£ΌλŠ” λ”•μ…”λ„ˆλ¦¬ μ„ μ–Έ 방법 
var dict4: [Int: String] = [1: "One", 2: "Two", 3: "Three"]
var dict5 = [1: "One", 2: "Two", 3: "Three"] 

 

βœ”οΈŽ Dictionary Key/Value 쌍 μΆ”κ°€, λ³€κ²½, μ‚­μ œ

  • updateValue(_:forKey:)
    νŠΉμ • ν‚€μ˜ 값을 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλŠ” λ©”μ†Œλ“œ. 기쑴에 μ‘΄μž¬ν•˜λŠ” 값을 λ°˜ν™˜.
  • removeValue(forKey:)
    νŠΉμ • ν‚€μ˜ 값을 μ‚­μ œν•  수 μžˆλŠ” λ©”μ†Œλ“œ. 기쑴에 μ‘΄μž¬ν•˜λŠ” 값을 λ°˜ν™˜.
  • μ„œλΈŒμŠ€ν¬λ¦½νŠΈ 문법
    dict[key] = value ν˜•νƒœμ˜ 문법을 ν†΅ν•΄μ„œ νŠΉμ • ν‚€μ˜ 값을 μΆ”κ°€, λ³€κ²½, μ‚­μ œν•  수 μžˆλ‹€.
dict4.updateValue("33333", forKey: 3)
// ν‚€/κ°’ λ³€κ²½ -> [3: "33333", 1: "One", 2: "Two"]

dict4.updateValue("Four", forKey: 4)
// ν‚€/κ°’ μΆ”κ°€ -> [3: "33333", 1: "One", 2: "Two", 4: "Four"]

dict4.removeValue(forKey: 1)
// ν‚€/κ°’ μ‚­μ œ -> [2: "Two", 3: "33333", 4: "Four"]

// μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ‘œ key 값을 지정
dict4[1] = "11111" // μΆ”κ°€
dict4[5] = "Five"  // λ³€κ²½
dict4[2] = nil     // μ‚­μ œ
// [5: "Five", 4: "Four", 1: "11111", 3: "33333"]

 

βœ”οΈŽ Dictionary μ—μ„œ κ°’ κ°€μ Έμ˜€κΈ°

μ„œλΈŒμŠ€ν¬λ¦½νŠΈ 문법을 ν†΅ν•΄μ„œ λ”•μ…”λ„ˆλ¦¬μ˜ νŠΉμ • ν‚€μ˜ 값을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜ν™˜ 값은 Optional type 으둜, λ”•μ…”λ„ˆλ¦¬μ— νŠΉμ • ν‚€κ°€ μ—†λŠ” 경우 nil 이 λ°˜ν™˜λ©λ‹ˆλ‹€. Optional binding λ˜λŠ” Forced Unwrapping 을 톡해 Optional 이 μ•„λ‹Œ νŠΉμ • νƒ€μž…μ˜ 값을 κ°€μ Έμ˜¬ 수 μžˆμ–΄μš”!

 

  • Optional binding :: if let ꡬ문을 톡해 Optional νƒ€μž…μ˜ 값이 μžˆλŠ”μ§€ ν™•μΈν•œ ν›„, μƒˆλ‘œμš΄ λ³€μˆ˜/μƒμˆ˜μ— λŒ€μž…ν•˜λŠ” 방식이닀.
  • Forced Unwrapping :: ! (exclamation mark) λ₯Ό λΆ™μ—¬ κ°•μ œλ‘œ Optional νƒ€μž…μ„ νŠΉμ • νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œλ‹€. ν‚€κ°€ λ°˜λ“œμ‹œ μžˆλ‹€λŠ” 것을 κ°€μ •ν•˜λ―€λ‘œ 값이 nil 경우 λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
// Optional binding
if let value = dict4[1] {
    print(value)
} else {
    print("Key not found")
}

// Forced Unwrapping
let value1 = dict4[1]! // "11111"
let value2 = dict4[2]! // error! 

 

βœ”οΈŽ Dictionary μ—μ„œ λ°˜λ³΅λ¬Έμ„ 톡해 key, value κ°€μ Έμ˜€κΈ°

  • for (key, value) in dict λ₯Ό 톡해 key, value λ₯Ό ν•¨κ»˜ λ°˜λ³΅ν•  수 μžˆλ‹€.
  • for key in dict.keys λ₯Ό 톡해 key 만 λ°˜λ³΅ν•  μˆ˜ μžˆλ‹€.
  • for value in dict.values λ₯Ό 톡해 value 만 λ°˜λ³΅ν•  수 μžˆλ‹€.
var myDict = [1: "One", 2: "Two", 3: "Three"]

for (key, value) in myDict {
    print(key, value)
}

for key in myDict.keys {
    print(key)
}

for value in myDict.values {
    print(value)
}

 

πŸ’‘ Dictionary μ •λ ¬ν•˜κΈ° ?!

기본적으둜 Dictionary λŠ” μˆœμ„œκ°€ μ—†λŠ” μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€! 그치만 sorted(by:) λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄ μˆœμ„œλ₯Ό 지정할 수 μžˆμ–΄μš”! μˆœμ„œκ°€ μ •λ ¬λœ λ”•μ…”λ„ˆλ¦¬κ°€ μ•„λ‹Œ, λ”•μ…”λ„ˆλ¦¬μ˜ (key, value) λ₯Ό Tuple ν˜•νƒœλ‘œ λ¬Άμ–΄, μ •λ ¬λœ 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

  • key κΈ°μ€€μœΌλ‘œ μ •λ ¬μ‹œ sorted ν•¨μˆ˜μ— {$0.0 < $1.0} ν΄λ‘œμ €λ₯Ό 전달
    첫번째 인수의 key κ°€ λ‘λ²ˆμ§Έ 인수의 key 보닀 μž‘μœΌλ©΄ μƒˆλ‘œμš΄ 배열에 μΆ”κ°€ν•œλ‹€.
  • value κΈ°μ€€μœΌλ‘œ μ •λ ¬μ‹œ sorted ν•¨μˆ˜μ— {$0.1 < $1.1} ν΄λ‘œμ €λ₯Ό 전달
    첫번째 인수의 value κ°€ λ‘λ²ˆμ§Έ 인수의 value λ³΄λ‹€ μž‘μœΌλ©΄ μƒˆλ‘œμš΄ 배열에 μΆ”κ°€ν•œλ‹€.
var scoreDict: [Int: Int] = [1: 90, 2: 50, 3: 30, 4: 100]
// key κ°’ κΈ°μ€€μœΌλ‘œ μ •λ ¬
let keySortedDict = scoreDict.sorted(by: {$0.0 < $1.0}) 
print(keySortedDict)
// [(key: 1, value: 90), (key: 2, value: 50), (key: 3, value: 30), (key: 4, value: 100)]

// value κ°’ κΈ°μ€€μœΌλ‘œ μ •λ ¬
let valueSortedDict = scoreDict.sorted(by: {$0.1 < $1.1}) 
print(valueSortedDict)
// [(key: 3, value: 30), (key: 2, value: 50), (key: 1, value: 90), (key: 4, value: 100)]

728x90
728x90