iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

https://ithelp.ithome.com.tw/upload/images/20231004/20130138DzyWQwOokJ.jpg
Photo by Sulthan Auliya on Unsplash
Queenstown, New Zealand

Press ‘Command + N’ to create a new Swift file named ‘Helper’

import Foundation

extension Bundle {
    func decode<T: Decodable>(_ type: T.Type, from file: String) -> T {
        guard let url = self.url(forResource: file, withExtension: nil) else {
            fatalError("Failed to locate \(file) in bundle.")
        }
        
        guard let data = try? Data(contentsOf: url) else {
            fatalError("Failed to load \(file) from bundle.")
        }
        
        let decoder = JSONDecoder()
        
        guard let loaded = try? decoder.decode(T.self, from: data) else {
            fatalError("Failed to decode \(file) from bundle.")
        }
        
        return loaded
    }
}

擴展了 Bundle 類型,增加了一個新的方法 decode,用於從 app 的 Bundle 中讀取並解碼 JSON 檔案。這種方法在 app 開發中常用於加載和解析存儲在 app bundle 內部的靜態資料。


https://ithelp.ithome.com.tw/upload/images/20231004/20130138AGfgdYA1Hw.png

改寫 PublicSwimmingPoolsView

struct PublicSwimmingPoolsView: View {
    
    let pools = Bundle.main.decode([PoolsSection].self, from: "pools.json")
    var body: some View {
        NavigationView {
            List {
                ForEach(pools) { (section) in
                    ForEach(section.items) { item in
                        NavigationLink(destination: PublicSwimmingPoolDetailView(publicSwimmingPool: item)) {
                            Text(item.name)
                        }
                    }
                }
            }
        }
        .navigationTitle(Text("Public Swimming Pools"))
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

關於

let pools = Bundle.main.decode([PoolsSection].self, from: "pools.json")
  1. Bundle.main:
    • 這是一個參考到主應用 bundle 的靜態屬性。通常,你的 app 的所有資源(如圖片、JSON 文件等)都被放在主應用 bundle 中。
  2. decode([PoolsSection].self, from: "pools.json"):
    • 這調用了前面定義在 Bundle 上的 decode 方法。
    • decode 方法的第一個參數指定了你想解碼的數據的類型。在這裡,它是 [PoolsSection].self,這意味著你希望從 JSON 文件中解碼一個 PoolsSection 對象的陣列。
    • 第二個參數是你想要從 bundle 中讀取和解碼的 JSON 文件的名稱,即 "pools.json"

改寫 PublicSwimmingPoolDetailView

struct PublicSwimmingPoolDetailView: View {
    var publicSwimmingPool: PoolItem
    var body: some View {
        VStack {
            Text("Hello, \(publicSwimmingPool.name)")
            Image(publicSwimmingPool.photoCredit)
                .resizable()
                .scaledToFit()
            Text(publicSwimmingPool.description)
        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20231004/20130138NBAuOuo3fN.png

下集待續


上一篇
Day 19: Codable, Equatable, Identifiable
下一篇
Day 21 : Figma 產生 SwiftUI code
系列文
SwiftUI 男孩30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言