iT邦幫忙

2025 iThome 鐵人賽

DAY 3
1
生成式 AI

30 天 Vibe Coding:全端 × 機器學習的實作挑戰系列 第 3

Day 3|30 天 Vibe Coding:記帳 App MVP

  • 分享至 

  • xImage
  •  

今天正式開始第一個 side project —— 記帳 App!
身為月光族,我真的很需要知道我的錢錢到底花去哪了,
所以今天就丟一個 prompt 給 Cursor,讓它幫我生出一個最小可行版本(MVP),然後在 Xcode 跑模擬器。
這個side project是完全for ios系統的,因為是用swift寫app,從來沒寫過想試試看而已,沒什麼特別的原因
之前有用過flutter,兼容安卓系統還有web,感覺是現在的主流。不過想說swift可能有apple比較漂亮的元件可以用。反正只是for我自己,我愛用什麼用什麼啦


今日目標

使用者可以輸入一筆支出(日期 / 金額)
新增後顯示在清單裡
刷新頁面後資料還能存在(先用 localStorage)


在 Xcode 建立 SwiftUI 專案

打開 Xcode → 選單 File > New > Project…
選擇 iOS → App → Next
輸入:
Product Name:ExpenseTracker
Interface:SwiftUI
Language:Swift
Minimum iOS:iOS 17
選好資料夾存檔 → Create
在 Cursor 打開這個專案資料夾,把下面 prompt 丟進去,它會幫你改好。
https://ithelp.ithome.com.tw/upload/images/20250901/20140998SMW90VpJJB.pnghttps://ithelp.ithome.com.tw/upload/images/20250901/20140998KAJaYM1Cbg.pnghttps://ithelp.ithome.com.tw/upload/images/20250901/20140998zmFX2wq5NA.png


給 Cursor 的 Prompt (僅供參考)

我喜歡寫詳細一點,因為我使用下來覺得cursor其實阿呆阿呆的,如果不給的完善一點,例如我說要做A,它會順便連B也做了,但我其實沒有要B功能。當然這些prompt也可以不用自己打,我都叫gpt生給我><

你現在在一個已存在的 Xcode SwiftUI 專案(ExpenseTracker)裡
請「只修改」下列兩個檔案:ExpenseTrackerApp.swift、ContentView.swift
不要新增任何檔案或套件,不要更動專案設定

目標:用 SwiftUI 做一個最簡單的記帳 App(MVP),iOS 17

=== 功能需求 ===
- 輸入欄位:金額 Double(數字鍵盤 .decimalPad)、日期 Date(預設今天)
- 按「新增紀錄」→ 立即出現在清單
- 清單每列顯示:「yyyy/MM/dd | $金額」
- 支援左滑刪除
- 送出後清空金額欄位
- 顯示「本月總支出」加總列(只加總當月紀錄)

=== 資料持久化 ===
- 使用 UserDefaults + Codable 儲存整個陣列
- Key:com.vibe.expenses
- App 啟動先 load(),每次變動自動 save()

=== 型別與架構 ===
- struct Expense: Identifiable, Codable { id(UUID), amount(Double), date(Date) }
- class ExpenseStore: ObservableObject
  - @Published var expenses: [Expense] = []
  - func load(), save(), add(amount: Double, date: Date), delete(at offsets: IndexSet)
- ContentView 以 @State 管理輸入值;使用 @StateObject 或 @EnvironmentObject 連結 ExpenseStore
- 新增按鈕在 amount <= 0 時 disabled

=== UI 細節 ===
- 單一主畫面:上方輸入區(TextField/DatePicker/新增按鈕),下方 List
- 金額顯示用 NumberFormatter 的 currency(TWD),實際存 Double
- 日期顯示用 DateFormatter("yyyy/MM/dd")

=== 實作提示 ===
- 提供私有的 static DateFormatter 與 NumberFormatter 單例
- 本月總支出可用 Calendar.current.isDate(_:equalTo:toGranularity: .month)

在 Xcode 測試 App 有兩種方式:

  1. SwiftUI Canvas 預覽
    打開 ContentView.swift 右邊就會出現 iPhone 預覽畫面
    這個模式會直接執行你的 SwiftUI 程式碼,所以像「輸入金額 → 新增到清單」這類互動都能即時看到效果
    不過它主要是給你快速試 UI,環境可能隨時重置,像是 App 重啟、背景執行、權限驗證等情境 Canvas 測不到
    https://ithelp.ithome.com.tw/upload/images/20250901/20140998C8c6XrljRf.png

  2. iOS 模擬器 / 真機測試
    在 Xcode 視窗左上角裝置選單,選一台模擬器(如 iPhone 16 Pro),或直接選擇你的 iPhone
    按 ▶︎ Run(或 Cmd + R),等它 build 完就會自動啟動模擬器並打開 App
    這個模式才會完整模擬 App lifecycle,例如重開 App 後 UserDefaults 資料是否還在


今日驗收 ✅

  1. 能新增一筆紀錄並顯示在清單中
  2. 資料存在 localStorage,刷新頁面後不會消失
  3. 有基本的表單 + 列表介面,MVP 成功
    https://ithelp.ithome.com.tw/upload/images/20250901/20140998TM50kKbb7P.pnghttps://ithelp.ithome.com.tw/upload/images/20250901/20140998yLSCrDpXOc.png

另外我還發現他幫我寫了深色模式跟淺色模式,當我手機是深色模式時,背景會是黑的,算是意外之喜/images/emoticon/emoticon24.gif
https://ithelp.ithome.com.tw/upload/images/20250901/20140998b7jj0CN1S0.png


push 上 Github

我是直接用 GitHub Desktop,用 Add Local Repository,指到我的 ExpenseTracker/ 專案根目錄(裡面有 ExpenseTracker.xcodeproj)
https://ithelp.ithome.com.tw/upload/images/20250901/20140998ZIgPu9F317.png

在右下角輸入 commit message,就可以 push 上去了
https://ithelp.ithome.com.tw/upload/images/20250901/20140998QmOWLoT2OM.png

我的程式碼放在這裡:2025ithome-ExpenseTracker


明日預告

Day 4 要繼續升級記帳 App:
加上 Google 登入
把資料存到 Firebase Firestore
變成跨裝置同步的雲端版!


上一篇
Day 2|30 天 Vibe Coding:要吃飯哪能沒有碗
下一篇
Day 4|30 天 Vibe Coding:換手機就失憶,帳本一定要上雲端
系列文
30 天 Vibe Coding:全端 × 機器學習的實作挑戰5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言