今天正式開始第一個 side project —— 記帳 App!
身為月光族,我真的很需要知道我的錢錢到底花去哪了,
所以今天就丟一個 prompt 給 Cursor,讓它幫我生出一個最小可行版本(MVP),然後在 Xcode 跑模擬器。
這個side project是完全for ios系統的,因為是用swift寫app,從來沒寫過想試試看而已,沒什麼特別的原因
之前有用過flutter,兼容安卓系統還有web,感覺是現在的主流。不過想說swift可能有apple比較漂亮的元件可以用。反正只是for我自己,我愛用什麼用什麼啦
使用者可以輸入一筆支出(日期 / 金額)
新增後顯示在清單裡
刷新頁面後資料還能存在(先用 localStorage)
打開 Xcode → 選單 File > New > Project…
選擇 iOS → App → Next
輸入:
Product Name:ExpenseTracker
Interface:SwiftUI
Language:Swift
Minimum iOS:iOS 17
選好資料夾存檔 → Create
在 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)
SwiftUI Canvas 預覽
打開 ContentView.swift 右邊就會出現 iPhone 預覽畫面
這個模式會直接執行你的 SwiftUI 程式碼,所以像「輸入金額 → 新增到清單」這類互動都能即時看到效果
不過它主要是給你快速試 UI,環境可能隨時重置,像是 App 重啟、背景執行、權限驗證等情境 Canvas 測不到
iOS 模擬器 / 真機測試
在 Xcode 視窗左上角裝置選單,選一台模擬器(如 iPhone 16 Pro),或直接選擇你的 iPhone
按 ▶︎ Run(或 Cmd + R),等它 build 完就會自動啟動模擬器並打開 App
這個模式才會完整模擬 App lifecycle,例如重開 App 後 UserDefaults 資料是否還在
另外我還發現他幫我寫了深色模式跟淺色模式,當我手機是深色模式時,背景會是黑的,算是意外之喜
我是直接用 GitHub Desktop,用 Add Local Repository,指到我的 ExpenseTracker/ 專案根目錄(裡面有 ExpenseTracker.xcodeproj)
在右下角輸入 commit message,就可以 push 上去了
我的程式碼放在這裡:2025ithome-ExpenseTracker
Day 4 要繼續升級記帳 App:
加上 Google 登入
把資料存到 Firebase Firestore
變成跨裝置同步的雲端版!