技術筆記-iOS實戰001-搞定基本的SwiftUI,並接上後台API

更新於 發佈於 閱讀時間約 10 分鐘

Part.1 搞定基本的 UI

開始開發 iOS App。

首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift:

import SwiftUI
struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

系統已經帶出最基本的 UI Layout VStack,就是會把裡面的元素從上往下排列。此基本專案依序顯示一個圖和一行字。


此圖的系統名為 "globe",那還有哪些系統內建的名稱可以用?原來 iOS 內建了一套極為豐富,超過 5000 個小圖示,稱為 SF Symbols 5,其中 SF 為 San Francisco 之意,而 Apple 系統所用的字體就叫 San Francisco,這一系列的圖示就是特別設計來完美搭配融合用的,真是貼心。為了開發過程可以方便查找圖示名稱,官方特別製作 App 給開發者用,可從上面官網連結下載安裝。

SF Symbols

SF Symbols

PS:後來發現,在 Xcode 的 library 瀏覽畫面中就可以查閱了,更方便。

raw-image


此外,顯示自己的圖檔也是一定會用到的,使用方式必須先把圖形檔加入專案目錄中的 Assets.xcassets 中納管,然後在程式中直接用名稱引用,以下在 VStack 裡面加入一個 HStack,水平並排放三個圖,再放一個 Spacer(),把空間撐開,讓剛剛的可視元件頂到最上方。最後在底層的 VStack 加入背景圖,整個程式變成這樣:

VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")

            HStack {
                Image(systemName: "sun.max")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
                Image("logo")
                Image(systemName: "sun.max")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
            }
            Spacer()
        }
        .background {
            Image("techNoteAvatar")
                .resizable()
                .scaledToFit()
                .ignoresSafeArea()
        }
        .padding()


raw-image





階段任務完成:

  1. 開發環境安裝
  2. 系統 Symbol 使用
  3. 外部圖像的使用
  4. VStack, HStack 兩種 Layout 的使用;還有一種 ZStack,就是在同一塊區域層層往上疊






加碼演練一個功能,叫 iPhone 念出中文文字:

import AVFoundation​
let synthesizer = AVSpeechSynthesizer()
func speak(text: String) {
let utterance = AVSpeechUtterance(string: text)
  utterance.voice = AVSpeechSynthesisVoice(language: "zh-TW") // "en-GB")
  synthesizer.speak(utterance)
}

在畫面任何一個地方加入按鈕,呼叫語音函數:

Button("中文語音") {
speak(text: "新人資訊,你好")
}


Part.2 接上後台 api

App 之所以好玩,在於手機的網路通訊能力,可以呼叫雲端做事,再加上因 GPS 而感知的地理位置,陀螺儀感知運動狀態,和透過藍芽連接周邊更多小裝置等等,搭配設計變化出許多有趣的應用。其中呼叫後台 api 算是最基本的,因此納入首要目標。


從我的後台系統隨意選一個 api,先用 Postman 測試,確認其可正常呼叫:

raw-image


開始撰寫 swift 端的程式,首先建立幾個資料結構,並創建兩個與 UI 狀態連動的變數,採用 @State 前綴字,準備用來承接 api 的回傳資料:

@State private var results: [Ohlc] = []
@State private var result: String = ""

struct Profile: Codable {
    let shortName: String
}

struct Ohlc: Codable, Identifiable {
    let day: String
    let Close: Double
    var id: String {
            day
        }
}

struct StockInfo: Codable {
    let info: Profile
    let hist: [Ohlc]
}

回傳資料的結構必須一一對應上,任何一個名稱或型別錯誤,都將導致 decode json string 失敗。其中 Codable Protocol 很顯然必須加入的,另外 Identifiable 則是為了在 UI 元件中的 List 需要它。


接下來是呼叫後台的主程式,這一段就有點技術含量了。

func fetchApiData() {
guard let url = URL(string:"https://myxxserver/dash/stockInfo?symbol=2330.TW&days=5")
  else {
  return
  }
  let task = URLSession.shared.dataTask(with: url) {
  (data, response, error) in
  if let error = error {
    print("Error: \(error)")
     return
    }
    guard let data = data else {
    return
    }
    do {
    let stockInfo = try JSONDecoder().decode(StockInfo.self, from: data)
     let info = stockInfo.info
     let hist = stockInfo.hist
     // begin to update UI in main thresd
     DispatchQueue.main.async {
      self.result = info.shortName
self.results = hist
     }
     } catch {
      print("Error parsing JSON: \(error)")
     }
    }
    task.resume()
}

以上代碼用到多次 guard let,確保程式執行穩健,若有問題可以提早跳出來,是很好的寫法。呼叫後台取資料是個容易有延遲的工作,因此必須用非同步的方式,開啟新的執行緒來執行,確認回傳結果正確後,再呼叫 DispatchQueue.main.async 排隊等候 UI 主執行緒任務空檔時接回資料。資料處理中的重點在於呼叫 JSONDecoder 將網路傳輸的字串解碼還原成物件。


UI 的佈局方面,先用一行顯示公司名稱,再跑一個迴圈,一天顯示一筆,顯示日期和股票收盤價格,放入主畫面的 VStack 中。

Text(result)
List(results) { ohlc in
let formattedPrice = String(format: "%.2f", ohlc.Close)
Text("\(ohlc.day): \(formattedPrice)")
}


raw-image



階段任務完成:

  1. 中文語音發聲
  2. 呼叫 api,非同步執行,創建資料結構和狀態變數承接資料,decode json 字串,並接回 UI 主執行緒顯示。
  3. List 元件迴圈顯示 UI










Newman 2024/6/5

導覽頁:紐曼的技術筆記-索引

參考資料:



留言
avatar-img
留言分享你的想法!
avatar-img
newman的沙龍
25會員
129內容數
漫步是一種境界。
newman的沙龍的其他內容
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/01
Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告
Thumbnail
2025/03/01
Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節旨在為讀者提供Swift程式語言的基礎知識,包括其基本語法、註解方法和變數使用方式,並通過具體的程式碼示例來說明這些概念。這將幫助讀者理解Swift的基本結構,並學會如何在Swift中定義變數並使用註解。
Thumbnail
本章節旨在為讀者提供Swift程式語言的基礎知識,包括其基本語法、註解方法和變數使用方式,並通過具體的程式碼示例來說明這些概念。這將幫助讀者理解Swift的基本結構,並學會如何在Swift中定義變數並使用註解。
Thumbnail
這份文件的目的是介紹Swift語言,包括它的特性、應用範疇,以及誰在使用它。它也提供了一些學習Swift的資源和工具,以及一些常見的Swift庫和框架。
Thumbnail
這份文件的目的是介紹Swift語言,包括它的特性、應用範疇,以及誰在使用它。它也提供了一些學習Swift的資源和工具,以及一些常見的Swift庫和框架。
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News