技術筆記-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
13會員
98內容數
漫步,悠閒自在的隨意行走!是行為,是態度,也是一種境界。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
newman的沙龍 的其他內容
技術筆記-用 python 操作 google firestore 的基本方法 (2023/12/26) 技術筆記-以 nodejs 為後台,以 google sheet 充當資料庫 (2022/11/29)
firestore 是 google 所提供的雲端文件式資料庫服務,為各種開發工具提供了方便使用的 sdk,python 的套件名稱為 firebase-admin,用 pip 安裝後就可操作了。 pip install firebase-admin
安裝完成 nodejs 後選用一個工作目錄執行 npm init,npm 會產生一個 package.json 檔案,之後為此專案安裝套件時都會記錄在此,讓專案可以很容易的重建和移植,也可設定 npm start 執行時以哪一個 js 檔當作系統入口。直接開寫了,以下我用 app.js 當作系統入口
首先安裝 python,依照 官網 的指示,下載正確的版本並執行就可,重點在以下。 虛擬環境的管理平台許多人使用 anaconda,許多教 python 的課程第一堂就是不管三七二十一先安裝再說,但我用了一陣子之後覺得它實在太笨重了,早有掙脫的想法,欣見原生的 python 已經具有虛擬環境管理模
技術筆記-用 python 操作 google firestore 的基本方法 (2023/12/26) 技術筆記-以 nodejs 為後台,以 google sheet 充當資料庫 (2022/11/29)
firestore 是 google 所提供的雲端文件式資料庫服務,為各種開發工具提供了方便使用的 sdk,python 的套件名稱為 firebase-admin,用 pip 安裝後就可操作了。 pip install firebase-admin
安裝完成 nodejs 後選用一個工作目錄執行 npm init,npm 會產生一個 package.json 檔案,之後為此專案安裝套件時都會記錄在此,讓專案可以很容易的重建和移植,也可設定 npm start 執行時以哪一個 js 檔當作系統入口。直接開寫了,以下我用 app.js 當作系統入口
首先安裝 python,依照 官網 的指示,下載正確的版本並執行就可,重點在以下。 虛擬環境的管理平台許多人使用 anaconda,許多教 python 的課程第一堂就是不管三七二十一先安裝再說,但我用了一陣子之後覺得它實在太笨重了,早有掙脫的想法,欣見原生的 python 已經具有虛擬環境管理模
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
大家是否有撰寫的心血因為不明原因,網路異常而造成心血全都消失,這篇純粹是一個抒發文...
Thumbnail
提到「做筆記」你會想到什麼?如果說知識的消化可以分為「輸入、處理和輸出」三個階段,那麼你又認為筆記扮演的任務角色會落到哪一個階段?做筆記只是「輸入」成效不高,想要「輸出」又耗時費力。要如何解決這個問題呢?卡片盒筆記法,就是目前最有效的解方,特別是在數位工具智能化之後,更顯得這套方法的強大。
Thumbnail
數位筆記術的改變力量 您有曾經煩惱過學習的效率嗎?或者是覺得難以捕捉那些稍縱即逝的靈感?在我們的日常生活和學習中,這些問題都是常見的挑戰。但幸運的是,有一種工具可以幫助我們改變這些情況,那就是數位筆記術。接下來,我將會講解三個使用數位筆記術的重要原則,這些原則能幫助我們更有效地學習和捕捉靈感。 原則
Thumbnail
《花漾年華》四連幅是我用當代水墨的抽象語彙,表現臺灣春天茂盛的新綠,充滿生命力,山櫻花盛開。傳統花鳥畫的創作哲學是「一花一世界,一葉一如來」,透過描繪大自然的生機呈現藝術家空靈的精神世界,心靈與自然合一,既超越自然又貼近自然。 在手工宣紙,揮灑充滿想像力的純淨世界,留白,紓解現代人過量的影音刺激。
Thumbnail
2014年人生峰迴路轉,從一個藝術愛好者,開始投身書畫創作,九個月後受邀舉辦第一次個展。江心靜透過墨彩融合的技法展現內在生命能量,在堆疊墨韻、鮮明色彩和象徵性符號中,營造藝術與靈性追求的意境,優遊於具象和抽象水墨間。 我用畫畫寫詩,好的詩打破既有窠臼,以全新角度看待人生,詩有無限可能,可以多重解讀。
Thumbnail
藝術家江心靜投入創作第二年,內在巨大無比的能量爆發,完成了 2015《藍色空間》三連幅當代水墨創作。 詩人的心找到了視覺語言,用深邃迷離的藍,與宇宙的能量結合,與早年創作的詩句呼應,內外合一的文人走向天命之路。
Thumbnail
雲海流動如一首神秘的歌,興起一股衝動,想透過創作表達心中感悟,第一個想法是強調「氣韻生動」的水墨,2012年採訪現代水墨之父劉國松,高齡八十的畫家精神奕奕,親自示範技法。 看著成品,在廚房燈下微笑,黑白構成的畫面,有一股力量,從山間飛到城市,推動著自己繼續,不在意繁華如夢,一步一步,往前走。
Thumbnail
兩年多前,開始有了重新架構網站的想法,所以把 Blogger 架設的網站,移轉至到了新的平台,當年我也做過了一些優缺點評析,剛好最近又再重新整理網站的所有架構,順便也重新啟動了一次 Hugo 架設網站的循環。
Thumbnail
因為要轉換一份新工作,認為自己在工作上必需更提高效率,剛好週圍有些朋友使用電子筆記,對於喜歡寫紙本筆記的人來說,是一個新的嘗試,原因有二:其一,筆記上有很多資料,在用完整本筆記之後,隨之石沉大海;其二,現在越來越多資訊是透過網路傳送,如果沒有好好收藏,資料就"放在"硬碟內了。 我是先去Youtube
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
大家是否有撰寫的心血因為不明原因,網路異常而造成心血全都消失,這篇純粹是一個抒發文...
Thumbnail
提到「做筆記」你會想到什麼?如果說知識的消化可以分為「輸入、處理和輸出」三個階段,那麼你又認為筆記扮演的任務角色會落到哪一個階段?做筆記只是「輸入」成效不高,想要「輸出」又耗時費力。要如何解決這個問題呢?卡片盒筆記法,就是目前最有效的解方,特別是在數位工具智能化之後,更顯得這套方法的強大。
Thumbnail
數位筆記術的改變力量 您有曾經煩惱過學習的效率嗎?或者是覺得難以捕捉那些稍縱即逝的靈感?在我們的日常生活和學習中,這些問題都是常見的挑戰。但幸運的是,有一種工具可以幫助我們改變這些情況,那就是數位筆記術。接下來,我將會講解三個使用數位筆記術的重要原則,這些原則能幫助我們更有效地學習和捕捉靈感。 原則
Thumbnail
《花漾年華》四連幅是我用當代水墨的抽象語彙,表現臺灣春天茂盛的新綠,充滿生命力,山櫻花盛開。傳統花鳥畫的創作哲學是「一花一世界,一葉一如來」,透過描繪大自然的生機呈現藝術家空靈的精神世界,心靈與自然合一,既超越自然又貼近自然。 在手工宣紙,揮灑充滿想像力的純淨世界,留白,紓解現代人過量的影音刺激。
Thumbnail
2014年人生峰迴路轉,從一個藝術愛好者,開始投身書畫創作,九個月後受邀舉辦第一次個展。江心靜透過墨彩融合的技法展現內在生命能量,在堆疊墨韻、鮮明色彩和象徵性符號中,營造藝術與靈性追求的意境,優遊於具象和抽象水墨間。 我用畫畫寫詩,好的詩打破既有窠臼,以全新角度看待人生,詩有無限可能,可以多重解讀。
Thumbnail
藝術家江心靜投入創作第二年,內在巨大無比的能量爆發,完成了 2015《藍色空間》三連幅當代水墨創作。 詩人的心找到了視覺語言,用深邃迷離的藍,與宇宙的能量結合,與早年創作的詩句呼應,內外合一的文人走向天命之路。
Thumbnail
雲海流動如一首神秘的歌,興起一股衝動,想透過創作表達心中感悟,第一個想法是強調「氣韻生動」的水墨,2012年採訪現代水墨之父劉國松,高齡八十的畫家精神奕奕,親自示範技法。 看著成品,在廚房燈下微笑,黑白構成的畫面,有一股力量,從山間飛到城市,推動著自己繼續,不在意繁華如夢,一步一步,往前走。
Thumbnail
兩年多前,開始有了重新架構網站的想法,所以把 Blogger 架設的網站,移轉至到了新的平台,當年我也做過了一些優缺點評析,剛好最近又再重新整理網站的所有架構,順便也重新啟動了一次 Hugo 架設網站的循環。
Thumbnail
因為要轉換一份新工作,認為自己在工作上必需更提高效率,剛好週圍有些朋友使用電子筆記,對於喜歡寫紙本筆記的人來說,是一個新的嘗試,原因有二:其一,筆記上有很多資料,在用完整本筆記之後,隨之石沉大海;其二,現在越來越多資訊是透過網路傳送,如果沒有好好收藏,資料就"放在"硬碟內了。 我是先去Youtube