[Swift] load(_:) method (fetching JSON data) λ―μ΄λ³΄κΈ°
import Foundation
//Create an array of landmarks that you initialize from landmarkData.json.
var landmarks: [Landmark] = load("landmarkData.json")
func load<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
// Data(contentsOf:) λ©μλλ₯Ό μ¬μ©νμ¬ νμΌμ λ΄μ©μ Data κ°μ²΄λ‘ μ½μ΄μ¨λ€.
// νμΌμ μ½λ κ³Όμ μμ μμΈκ° λ°μν μ μμΌλ―λ‘ try-catch λ¬Έμ μ¬μ©νμ¬ μμΈ μ²λ¦¬λ₯Ό νλ€.
// μμΈκ° λ°μν κ²½μ°, fatalErrorλ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ μ€μ§νκ³ μ€λ₯ λ©μμ§λ₯Ό μΆλ ₯νλ€.
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
// JSONDecoder μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , decode(_:from:) λ©μλλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό λμ½λ©νλ€.
// λμ½λ©ν νμ
μ T.selfλ‘ μ λ¬λλ©°, μ΄λ μ λ€λ¦μΌλ‘ μ λ¬λ°μ νμ
Tμ μ€μ νμ
μ λνλ
λλ€.
// λμ½λ© κ³Όμ μμ μμΈκ° λ°μν μ μμΌλ―λ‘ try-catch λ¬Έμ μ¬μ©νμ¬ μμΈ μ²λ¦¬λ₯Ό νλ€.
// μμΈκ° λ°μν κ²½μ°, fatalErrorλ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ μ€μ§νκ³ μ€λ₯ λ©μμ§λ₯Ό μΆλ ₯νλ€.
// λμ½λ©μ΄ μ±κ³΅νλ©΄ λμ½λ©λ κ°μΈ Tλ₯Ό λ°ννλ€.
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
μμ μ½λλ μ λ€λ¦ ν¨μμΈ loadλ₯Ό μ μνκ³ μλ€. νμΌμμ λ°μ΄ν°λ₯Ό λ‘λνκ³ , ν΄λΉ λ°μ΄ν°λ₯Ό μ§μ λ νμ
μΌλ‘ λμ½λ©νμ¬ λ°ννλ μ½λμ΄λ€! Decodable νλ‘ν μ½μ μ€μνλ ꡬ쑰체 λλ ν΄λμ€ νμ
μ μ§μ νμ¬ load ν¨μλ₯Ό νΈμΆνλ©΄, ν΄λΉ νμΌμ λ°μ΄ν°κ° λμ½λ©λμ΄ ν΄λΉ νμ
μ μΈμ€ν΄μ€λ‘ λ°νλλ€. μ΄λ₯Ό ν΅ν΄ JSON λ°μ΄ν°λ₯Ό Swift κ°μ²΄λ‘ λ³ννμ¬ μ¬μ©ν μ μλ€.
file λ³μλ₯Ό μ΅μ λ λ°μΈλ© → λ©μλμ κ²°κ³Όκ° nilμ΄ μλ κ²½μ°μλ§ fileμ κ°μ΄ ν λΉ → νμΌμ λ΄μ©μ Data κ°μ²΄λ‘ μ½μ΄μ€κΈ° → JSONDecoder μΈμ€ν΄μ€λ₯Ό μμ± → decode(_:from:) λ©μλλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό λμ½λ©
π€ μ λ€λ¦ νμ
T?
μ λ€λ¦ νμ Tλ ν¨μλ νμ μ μ μν λ μ€μ λ‘ μ¬μ©λ νμ μ λνλ΄λ μΌμ’ μ νλ μ΄μ€νλ
Tλ νμ νλΌλ―Έν°λ‘μ, ν¨μκ° νΈμΆλ λ μ€μ νμ μΌλ‘ λ체λλ€.
μ λ€λ¦μ μ¬μ©νμ¬ ν¨μλ νμ μ μ μνλ©΄, μ¬λ¬ λ€λ₯Έ νμ μ λν΄ λμνλ μ μ°νκ³ μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±ν μ μλ€. ν¨μλ νμ μ μΌλ°νν μ μμΌλ©°, λ€μν νμ μ λν΄ λμΌν λμμ μνν μ μμ΅λλ€.
μμ μ½λμμ load ν¨μλ TλΌλ μ λ€λ¦ νμ μ λ°λλ€. μ΄ ν¨μλ₯Ό νΈμΆν λ Tμλ μ€μ λ‘ μ¬μ©ν νμ μ΄ μ§μ λλ€.
μλ₯Ό λ€μ΄, load<Landmark>("landmarks.json")μ κ°μ΄ νΈμΆνλ©΄ Tλ Landmark νμ μΌλ‘ λ체λλ€.
μ λ€λ¦μ μ¬μ©νλ©΄ μ½λλ₯Ό νμ μ λ 립μ μΌλ‘ μμ±ν μ μμΌλ―λ‘, ν¨μλ νμ μ μ¬μ¬μ©ν μ μλ μ₯μ μ΄ μλ€. λ€μν νμ μ λν΄ λμνλ λ¨μΌ ν¨μλ₯Ό μμ±νκ³ , ν΄λΉ ν¨μλ₯Ό λ€μν νμ μΌλ‘ νΈμΆν μ μλ€. μ΄λ‘μ¨ μ½λμ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μμ±μ ν₯μμν¬ μ μλ€.
π€ filename μμ λΆλ '_' λ λκΉ?
`load` ν¨μμ λ§€κ°λ³μ `filename` μμ λΆμ `_`λ μμΌλμΉ΄λ μλ³μμ λλ€. μμΌλμΉ΄λ μλ³μλ λ§€κ°λ³μ μ΄λ¦μ μλ΅νκ³ μ ν λ μ¬μ©λλ€.
`load` ν¨μλ νΈμΆλ λ νμΌ μ΄λ¦μ μΈμλ‘ μ λ¬λ°μμΌ νλ€. κ·Έλ¬λ ν¨μ λ΄μμλ `filename`μ μ¬μ©νμ§ μκ³ μλ€. λ°λΌμ, ν¨μ νΈμΆμμκ² νμΌ μ΄λ¦μ μ λ¬νκΈ° μν λͺ©μ μΌλ‘ λ§€κ°λ³μ μ΄λ¦μ νμλ‘ νμ§ μλλ€.
μμΌλμΉ΄λ μλ³μ `_`λ μ΄λ¬ν κ²½μ°μ μ¬μ©λλ€. λ§€κ°λ³μ μ΄λ¦μ μλ΅ν¨μΌλ‘μ¨ νΈμΆμμκ²μ νμΌ μ΄λ¦μ μ λ¬λ°μ μ μκ² λλ€. ν¨μ λ΄μμλ ν΄λΉ λ§€κ°λ³μλ₯Ό μ¬μ©νμ§ μμΌλ―λ‘ μλ΅ν΄λ λ¬Έμ κ° μλ€.
λ°λΌμ, `func load<T: Decodable>(_ filename: String)`μ λ§€κ°λ³μ `filename`μ κ°μ§μ§λ§, νΈμΆ μμλ νμΌ μ΄λ¦λ§ μ λ¬νλ©΄ λλ€. `_`λ νΈμΆμμκ² ν΄λΉ λ§€κ°λ³μμ μ΄λ¦μ κ°μΆκ³ μΆμ λ μ¬μ©λλ νκΈ°λ²μ΄λ€.
+) λ§€κ°λ³μμ μ΄λ¦μ κ°μΆμ§ μμ κ²½μ° μ½λμ λͺ¨μ΅let result: MyType = load<MyType>(filename: "data.json")β
π€ guardλ λμ§?
guard ꡬ문μ μ£Όμ λͺ©μ μ μ‘°κ±΄μ΄ μΆ©μ‘±λμ§ μμΌλ©΄ μ‘°κΈ°μ ν¨μλ₯Ό μ’ λ£νκ±°λ μμΈ μ²λ¦¬λ₯Ό μννμ¬ μ½λ μ€νμ κ³μνκΈ° μ μ μμΈ μν©μ μ²λ¦¬νλ κ²
: μ½λμ κ°λ μ±μ ν₯μ, 쑰건μ μΆ©μ‘±νμ§ μμ λμ νΉμν μν©μ λͺ μμ μΌλ‘ μ²λ¦¬κ° κ°λ₯
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
μμ μ½λλ guard ꡬ문μ μ¬μ©νμ¬ Bundle.main.url(forResource:withExtension:) λ©μλμ κ²°κ³Όλ₯Ό λ°μΈλ©νκ³ , 쑰건μ μΆ©μ‘±νμ§ μμ κ²½μ° fatalErrorλ₯Ό λ°μμν€λ μ½λμ΄λ€.
Bundle.main.url(forResource:withExtension:) λ©μλλ₯Ό νΈμΆνμ¬ νμΌμ URLμ κ°μ Έμ¨λ€. μ΄λ filenameμ νμΌ μ΄λ¦μΌλ‘ μ λ¬νκ³ , withExtensionμ νμΌμ νμ₯μλ₯Ό λνλ΄λλ°, nilλ‘ μ λ¬λμ΄ νμ₯μλ₯Ό μλ΅ν¨μ μλ―Ένλ€.
guard ꡬ문μ 쑰건μμλ file λ³μλ₯Ό μ΅μ λ λ°μΈλ©νλ€. Bundle.main.url(forResource:withExtension:) λ©μλμ κ²°κ³Όκ° nilμ΄ μλ κ²½μ°μλ§ fileμ κ°μ΄ ν λΉλκ³ , 쑰건μ μΆ©μ‘±νμ§ μμ κ²½μ° else λΈλ‘μ΄ μ€νλλ€.
else λΈλ‘ λ΄λΆμμλ fatalErrorλ₯Ό νΈμΆνμ¬ μ€λ₯ λ©μμ§μ ν¨κ» νλ‘κ·Έλ¨μ μ€μ§μν¨λ€. fatalError ν¨μλ₯Ό νΈμΆνλ©΄ νλ‘κ·Έλ¨μ΄ μ¦μ μ’ λ£λλ©°, μ΄νμ μ½λλ μ€νλμ§ μλλ€.
μ¦, μμ μ½λλ νμΌμ URLμ κ°μ Έμ€λ κ³Όμ μμ λ¬Έμ κ° λ°μν κ²½μ°, νλ‘κ·Έλ¨μ μ€μ§νκ³ μ€λ₯ λ©μμ§λ₯Ό μΆλ ₯νλ κ²μ λͺ©μ μΌλ‘ νλ€. μ΄λ νμΌμ μ°Ύμ μ μλ μν© λ± μμμΉ λͺ»ν μ€λ₯μ λλΉνμ¬ νλ‘κ·Έλ¨μ μμ μ±μ λμ΄λλ° λμμ μ€λ€.