Bibi's DevLog π€π
[Swift μλ£κ΅¬μ‘°] 2. Dictionary λμ λ리 (μμ±, CRUD) λ³Έλ¬Έ
[Swift μλ£κ΅¬μ‘°] 2. Dictionary λμ λ리 (μμ±, CRUD)
λΉλΉ bibi 2022. 12. 16. 16:00Data Structure in Swift (iOS)β-βPart 1
μ λ λ¬Έμλ₯Ό μ°Έκ³ ν΄ μμ±νμ΅λλ€.
Dictionary λμ λ리
: ν€-κ° μμ μμλ‘ κ°λ 컬λ μ .
@frozen struct Dictionary<Key, Value> where Key : Hashable
μκ°
λμ λ리λ ν΄μ ν μ΄λΈμ μΌμ’ μ΄λ€. (λ€λ₯Έ μΈμ΄μμλ hashes λ associated arraysλΌκ³ λ λΆλ¦°λ€)
- νλͺ©λ€μ λν λΉ λ₯Έ μ κ·Όμ΄ κ°λ₯νλ€
λμ λ리μ κ° νλͺ©μ ν€keyλ₯Ό ν΅ν΄ ꡬλ³λλ©°, ν€μ μμνλ κ°valueμ κ°μ§λ€.
- ν€λ hashableν νμ
μ΄μ΄μΌ νλ€.
Hashable
νλ‘ν μ½μ μ€μνλ λͺ¨λ νμ μ ν€κ° λ μ μλ€.
- ν€λ μμνλ κ°μ μ°ΎκΈ° μν΄ μ¬μ©λλ€.
- κ°μ μ΄λ€ κ°μ²΄λ ν λΉν μ μλ€.
λμ λ리μ νΉμ§
- μμλ₯Ό 보μ₯νμ§ μλλ€.
- μμλ₯Ό λ£μ μμλλ‘ μ 리λμ΄ μμ§ μλ€.
- 컬λ μ μ΄ λ³κ²½λκΈ° μ κΉμ§λ μμμ μμκ° μ μ§λλ€.
λμ λ리 μμ±νκΈ°
λμ
λ리 리ν°λ΄([:]
)μ ν΅ν΄ μμ±μ΄ κ°λ₯νλ€.
- μΌνλ‘ κ΅¬λΆλ ν€:κ° μμΌλ‘ μ΄λ£¨μ΄μ Έ μλ€.
- κ°κ°μ ν€λ μ°κ΄λ κ°μ κ°μ§λ€.
μμ/λ³μμ λμ λ리λ₯Ό ν λΉνκ±°λ, ν¨μμ λμ λ리λ₯Ό λκΈ°λ κ²λ κ°λ₯νλ€.
// λμ
λ리 λ§λ€κΈ° - HTTP μλ΅ μ½λμ μ°κ΄ λ©μμ§
var responseMessages = [200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"]
// λΉ λμ
λ리 λ§λ€κΈ° - ν€μ κ°μ νμ
μ μ μΈ μ λͺ
μν΄μΌ ν¨
var emptyDict: [String: String] = [:]
λμ λ리μ κ°μ λ£κ±°λ κ°μ Έμ€κΈ° (CRUD)
λμ λ리μ κ° κ°μ Έμ€κΈ° - μλΈμ€ν¬λ¦½νΈ
- λμ
λ리μ ν€ κ°μ μλΈμ€ν¬λ¦½νΈλ‘ νμ©ν΄ κ°μ κ°μ Έμ¬ μ μλ€.
O(1)
.- μ΅μ λ κ°μ 리ν΄νλ€ - κ·Έ ν€μ ν΄λΉνλ κ°μ΄ μλ κ²½μ° nilμ λ°ννκΈ° μν΄.
print(responseMessages[200])
// Prints "Optional("OK")"
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"
contains(where:)
:O(n)
- 쑰건μ ν΄λΉνλ κ°μ΄ μλμ§ μλμ§ νμΈν μ μλ€.
λμ λ리μ κ° κ°μ Έμ€κΈ° - μΈλ±μ€
index(forKey:)
: νκ·O(1)
- μ£Όμ΄μ§ ν€μ λν μΈλ±μ€λ₯Ό λ°ννλ€.
firstIndex(where:)
: 쑰건μ ν΄λΉνλ μΈλ±μ€λ₯Ό μ°Ύμ μ μλ€.- μλΈμ€ν¬λ¦½νΈμ λ¬λ¦¬, μΈλ±μ€λ₯Ό ν΅ν΄ λμ λ리 κ°μ κ°μ Έμ€λ©΄ ν€-κ° μμ μ΅μ λ μμ΄ λ°ννλ€.
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
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.")
print(imagePaths[glyphIndex!])
// Prints "(key: "star", value: "/glyphs/star.png")"
- βοΈ λμ
λ리μ μΈλ±μ€λ λ²νΌλ₯Ό μΆκ° ν λΉνμ§ μκ³ κ°μ κ³μ μ μ₯ν μ μλ λμμ μ ν¨μ±μ΄ μ μ§λλ€. νμ§λ§ λμ
λλ¦¬κ° μ»€μ Έμ λ²νΌλ₯Ό λλ €μΌ νλ€λ©΄, κΈ°μ‘΄μ μΈλ±μ€λ€μ΄ μλ¬΄λ° κ²½κ³ μμ΄ μ ν¨μ±μ΄ μμ΄μ§ μ μλ€.
- λ°λΌμ λ§μ½ λμ
λ리μ ν λΉν κ°μ μλ₯Ό μκ³ μλ€λ©΄,
init(minimumCapacity:)
μμ±μλ₯Ό μ¬μ©ν΄ μ μ ν ν¬κΈ°μ λ²νΌλ₯Ό 미리 ν λΉν΄μΌ νλ€.
- λ°λΌμ λ§μ½ λμ
λ리μ ν λΉν κ°μ μλ₯Ό μκ³ μλ€λ©΄,
λμ λ리μ κ° μ½μ νκΈ°, μμ νκΈ°, μμ νκΈ°
κ°μ κ°μ Έμ¬ λμ λ§μ°¬κ°μ§λ‘ μλΈμ€ν¬λ¦½νΈλ₯Ό νμ©νλ€.
- κ° μ½μ νκΈ° : μλ‘μ΄ ν€μ μΆκ°ν κ°μ ν λΉνλ€.
- κ° μμ νκΈ° : κΈ°μ‘΄ ν€μ μμ ν μλ‘μ΄ κ°μ ν λΉνλ€.
- κ° μμ νκΈ° : κΈ°μ‘΄ ν€μ nilμ ν λΉνλ€.
μμ , μμ μ λ°°μ΄μ²λΌ μ 곡λλ λ©μλλ₯Ό μ¬μ©ν μλ μλ€.
- e.g. κ° μμ :
remove(at:), removeValue(forKey:), removeAll(keepingCapacity:)
. λͺ¨λO(n)
.
responseMessages[301] = "Moved permanently" // κ° μ½μ
νκΈ°
print(responseMessages[301])
// Prints "Optional("Moved permanently")"
responseMessages[404] = "Not found" // κ° μμ νκΈ°
responseMessages[500] = nil // κ° μμ νκΈ°
print(responseMessages)
// Prints "[301: "Moved permanently", 200: "OK", 403: "Access forbidden", 404: "Not found"]"
λ³μμΈ λμ λ리 μΈμ€ν΄μ€μ λν΄μλ, ν€λ₯Ό ν΅ν΄ μ κ·Όν κ°μ μ μ리μμ μμ ν μλ μλ€.
- μλ μμλ
[String:[Int]]
νμ μ λμ λ리λ₯Ό μ μΈνκ³ , μ μ리μμ κ°κ°μ κ°([Int]
) μ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬νκ³ μλ€.
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]"
λμ λ리μ λ΄μ© λ°λ³΅νκΈ°(μννκΈ°)
λμ λ리λ μμκ° μλ ν€-κ° μμ 컬λ μ μ΄λ€.
- ν€-κ° μμ μμλ λμ λ리μ λ³ν(μ½μ , μμ , μμ λ±)κ° μΌμ΄λκΈ° μ κΉμ§λ μ μ§λλ, λ³νκ° μΌμ΄λ νμλ μμλ₯Ό μμΈ‘ν μ μλ€.
- λ§μ½ ν€-κ° μμ μ¬μ©νλ©΄μλ μμκ° μλ 컬λ μ
μ μ°κ³ μΆκ³ , λμ
λ리μ κ°μ λΉ λ₯Έ ν€ νμμ΄ νμμλ€λ©΄,
KeyValuePairs
λΌλ νμ μ λμ λ리 λμ μ¬μ©ν μ μλ€.
λμ
λ리λ₯Ό μννκΈ° μν΄μλ for-in
루νλ₯Ό μ¬μ©ν΄μΌ νλ€.
- ν€-κ° μμ ννμ μμλ‘ λΆν΄ν΄ μ¬μ©ν μ μλ€.
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'."