Task { do { let 作品列表 = try await 搜尋作品列表(搜尋字串, max: 20) for 作品 in 作品列表 { let 作品資訊 = try await 作品圖(作品.api_link!) 作品圖列表.append(作品資訊) } } catch { print("網路有問題:\(error)") } }
完整包含測試預覽的程式如下,我們仍用 List 來展現取得的作品列表,和上一節類似,但每個作品名稱加上網址連接,點選作品名稱時,會帶出瀏覽器載入圖片,在此範例初次使用到 Link 視圖:
// 4-10(3) 取得作品資訊 // Created by Heman, 2022/07/25 import SwiftUI
// 2nd data model for JSONDecoder() // Sample URL https://api.artic.edu/api/v1/artworks/28560 struct 藝術作品: Codable { let data: 作品資訊 let config: 配置資訊 }
struct 作品資訊: Codable, Identifiable { let id: Int let api_link: URL? let title: String let date_display: String let artist_display: String let artist_id: Int let artist_title: String let image_id: String }
struct 配置資訊: Codable { let iiif_url: URL? let website_url: URL? }
// 作品圖 // 「圖檔網址」採用 IIIF v2 標準格式,範例如下: // https://www.artic.edu/iiif/2/25c31d8d-21a4-9ea1-1d73-6a2eca4dda7e/full/843,/0/default.jpg // https://www.artic.edu/iiif/2/25c31d8d-21a4-9ea1-1d73-6a2eca4dda7e/full/max/0/default.jpg // 其中 "25c31d8d-21a4-9ea1-1d73-6a2eca4dda7e" 為 image_id struct 作品圖: Identifiable { let id: Int let 作品名稱: String let 作者: String let 圖檔網址: URL? // 取得作品資訊: // let 網址 = "https://api.artic.edu/api/v1/artworks/28560" // guard let myURL = URL(string: 網址) else { return } init(_ myURL: URL) async throws { let (回傳資料, _) = try await URLSession.shared.data(from: myURL) let 取得作品 = try JSONDecoder().decode(藝術作品.self, from: 回傳資料) // print(取得作品.data) var 組合網址 = URLComponents() 組合網址.scheme = "https" 組合網址.host = "www.artic.edu" 組合網址.path = "/iiif/2/\(取得作品.data.image_id)/full/843,/0/default.jpg" id = 取得作品.data.id 作品名稱 = 取得作品.data.title 作者 = 取得作品.data.artist_display 圖檔網址 = 組合網址.url } }
struct 測試_3: View { @State var 搜尋字串 = "Vincent van Gogh" // @State var 作品列表: [搜尋品項] = [] @State var 作品圖列表: [作品圖] = [] var body: some View { VStack { 畫家選單(name: $搜尋字串) .onChange(of: 搜尋字串) { _ in Task { do { 作品圖列表 = [] let 作品列表 = try await 搜尋作品列表(搜尋字串, max: 20) for 作品 in 作品列表 { let 作品資訊 = try await 作品圖(作品.api_link!) 作品圖列表.append(作品資訊) } } catch { print("網路有問題:\(error)") } } } List(作品圖列表) { 作品 in Link(destination: 作品.圖檔網址!) { Text(作品.作品名稱) .font(.title2) } } .task { do { let 作品列表 = try await 搜尋作品列表(搜尋字串, max: 20) for 作品 in 作品列表 { let 作品資訊 = try await 作品圖(作品.api_link!) 作品圖列表.append(作品資訊) } } catch { print("網路有問題:\(error)") } } } } }
struct 預覽_3: PreviewProvider { static var previews: some View { 測試_3() } }
測試預覽的主畫面,由 List + Link 組成,List 不需要另外寫出 id 欄位,因為「作品圖列表」已符合 Identifiable 規範。只要特別注意初次使用的 Link 視圖語法,其實就是用 destination 參數,給文字加上網址連結(與上一節比較,帶連結的文字,預設顏色會不一樣):
這段錯誤訊息:Cannot use instance member ‘英文名’ within property initializer; property initializers run before ‘self’ is available. 現在應該比較能理解了,’self’ 指的就是物件個體的自我,自我還未成形,屬性當然無法使用。
struct 藝術作品: Codable { let data: 作品資訊 let config: 配置資訊 }
struct 作品資訊: Codable, Identifiable { let id: Int let api_link: URL? let title: String let date_display: String let artist_display: String let artist_id: Int let artist_title: String let image_id: String }
struct 配置資訊: Codable { let iiif_url: URL? let website_url: URL? }
struct 作品圖: Identifiable { let id: Int let 作品名稱: String let 作者: String let 圖檔網址: URL? let 圖片: UIImage?
1986年10月台大活動中心舉行一場「資訊週」展覽,由資訊工程系主辦,展出內容包括IBM PC 以及許舜欽教授「電腦下象棋」、李琳山教授「電腦說國語」等PC軟體,最特別的還有一台傳說中的Apple Macintosh 「麥金塔」電腦,這是筆者第一次接觸到Mac。
1980年代是PC剛萌芽,電腦開始進入社會的啟蒙階段,在這之前,電腦(或稱「電子計算機」)雖已發展30-40年,由於價格昂貴,只有軍方、學術、政府單位或大企業才用得起,商業電腦從大型電腦(mainframe)發展到工作站(workstation),售價都不是一般家庭買得起的,直到 Apple 1977年推出 Apple II 大受歡迎,隨後 IBM 1981年推出 Personal Computer (IBM PC),才逐漸進入一般人視野中。
新版 Swift Playgrounds 4.2 昨天上架到App Store了,要安裝之前,記得先升級作業系統到iPadOS 16或macOS 13。
與半年前的Swift Playgrounds 4.1相比,主要差異如下:
1. Swift 程式語言的版本從 5.6 升級到 5.7 2. 增加若干電子書內容與範例程式 3. 支援今年WWDC 2022發表的SwiftUI新功能 Swift 5.7 是程式語言的升級,上個月(2022/9)才正式發表,從上圖可以看出,Swift Playgrounds 4.2 裡面的官方範例,所有 App (.swiftpm) 與電子書(.playgroundbook)都已用 Swift 5.7 改寫。
Swift 5.7 除了增加若干新的語法與物件之外,最重要的是改寫底層程式庫,讓程式編譯與執行的速度增加不少,是一次相當重要的升級。如這個澳洲網站所說:
Swift 5.7, the latest update of Apple’s Swift programming language, is now available, with usability improvements, a smaller and faster standard library, faster build and launch times, and a new generics implementation.