ChatGPTだけで貯金アプリを作ってみた
どうも!CABOです。
今回はChatGPTとiPadだけで貯金アプリを作ってみたので、ここにまとめてみました。ぜひ最後まで見てくださいね。
ChatGPTでアプリを作ってみようと思った理由
なぜ私がアプリが豊富にあるこの世の中、自分自身でアプリを作ってみようと思った理由は何なのか。それは単純な興味です。私はもともとアプリ開発が好きで、今までにもいくつかアプリを開発してきました。そんな趣味であるアプリ開発と大好きなChatGPTを組み合わせたらめちゃくちゃ楽しいのではないか⁉︎と考えたからです。
使用するもの
ChatGPT-3.5
playgrounds(iPad)
作るアプリの概要
貯金アプリ
・貯金額の追加
・貯金額の確認
・貯金額のリセット
コードを書いてもらう
早速コードを書いてもらいましょう。前述した必要な機能と使用する言語を伝えましょう。
CABO:Swiftで貯金アプリを作ってください。機能としては金額の追加、金額のリセット、合計金額の表示です。
ChatGPT:もちろんです。以下は、簡単な貯金アプリのコード例です。XcodeでSwiftを使用しています。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var amountLabel: UILabel!
var totalAmount: Double = 0.0
override func viewDidLoad() {
super.viewDidLoad()
updateAmountLabel()
}
@IBAction func addAmount(_ sender: UIButton) {
let newAmount = 10.0 // 追加する金額をここで指定できます
totalAmount += newAmount
updateAmountLabel()
}
@IBAction func resetAmount(_ sender: UIButton) {
totalAmount = 0.0
updateAmountLabel()
}
func updateAmountLabel() {
amountLabel.text = "合計金額: ¥\(totalAmount)"
}
}
この例では、金額の追加(addAmountメソッド)、金額のリセット(resetAmountメソッド)、および合計金額の表示(updateAmountLabelメソッド)の機能があります。Storyboardでラベルとボタンを配置し、適切に接続してください。このコードは基本的な機能の例であり、実際のアプリにはさらなる機能やエラー処理が必要かもしれません。
ここまでをplaygroundsにコピペして実行してみると…。
おや、エラーが出てしまいました。このことをChatGPTに伝えて直してもらいましょう。
CABO:ここがエラーになります。
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
ChatGPT:提供されたコードは、SwiftUIを使用してiOSアプリケーションを構築するための基本的な構造です。ContentViewはアプリケーションのメインビューを表しています。もし、先ほど提供した貯金アプリのSwiftコードと組み合わせる場合、次のようになります。
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject private var viewModel = SavingsViewModel()
var body: some View {
VStack {
Text("合計金額: ¥\(viewModel.totalAmount)")
.padding()
Button("金額を追加") {
viewModel.addAmount()
}
.padding()
Button("金額をリセット") {
viewModel.resetAmount()
}
.padding()
}
}
}
class SavingsViewModel: ObservableObject {
@Published var totalAmount: Double = 0.0
func addAmount() {
let newAmount = 10.0
totalAmount += newAmount
}
func resetAmount() {
totalAmount = 0.0
}
}
このコードでは、ContentViewがSwiftUIのビューを定義しSavingsViewModelがアプリのロジックを管理しています。ボタンがタップされると、対応するメソッドが呼び出され、@Publishedプロパティに変更が反映され、UIが更新されます。
これでどうかな?
できたはできたけど、貯金アプリとして欠陥がありすぎる!ということで追加の指示。
CABO:硬貨、紙幣ごとに金額を追加できるようにしたいです。
ChatGPT:理解しました。硬貨と紙幣ごとに金額を追加できるように、それぞれの追加ボタンを作成し、それに対応する金額をトラッキングするように変更します。以下がその例です。
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject private var viewModel = SavingsViewModel()
var body: some View {
VStack {
Text("合計金額: ¥\(viewModel.totalAmount)")
.padding()
HStack {
MoneyButton(value: 10, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 50, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 100, viewModel: viewModel, moneyType: .coin)
}
.padding()
HStack {
MoneyButton(value: 1000, viewModel: viewModel, moneyType: .bill)
MoneyButton(value: 5000, viewModel: viewModel, moneyType: .bill)
MoneyButton(value: 10000, viewModel: viewModel, moneyType: .bill)
}
.padding()
Button("金額をリセット") {
viewModel.resetAmount()
}
.padding()
}
}
}
enum MoneyType {
case coin
case bill
}
struct MoneyButton: View {
let value: Double
@StateObject var viewModel: SavingsViewModel
let moneyType: MoneyType
var body: some View {
Button("\(moneyType == .coin ? "硬貨" : "紙幣") ¥\(value)") {
viewModel.addAmount(value, for: moneyType)
}
.padding()
}
}
class SavingsViewModel: ObservableObject {
@Published var coinAmount: Double = 0.0
@Published var billAmount: Double = 0.0
var totalAmount: Double {
coinAmount + billAmount
}
func addAmount(_ amount: Double, for moneyType: MoneyType) {
switch moneyType {
case .coin:
coinAmount += amount
case .bill:
billAmount += amount
}
}
func resetAmount() {
coinAmount = 0.0
billAmount = 0.0
}
}
このコードでは、硬貨と紙幣それぞれに対するボタンを追加し、それに応じて金額を更新するようにしています。SavingsViewModelでは、硬貨と紙幣の金額を別々にトラッキングし、addAmountメソッドでそれぞれの金額を更新しています。
追加できたかな?
できてる、できてるけどボタンの種類が足りない…。ということで追加。
CABO:1円、5円、500円のボタンも追加してください。
ChatGPT:もちろんです。1円、5円、500円のボタンも追加した以下の例をご確認ください。
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject private var viewModel = SavingsViewModel()
var body: some View {
VStack {
Text("合計金額: ¥\(viewModel.totalAmount)")
.padding()
HStack {
MoneyButton(value: 1, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 5, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 10, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 50, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 500, viewModel: viewModel, moneyType: .coin)
}
.padding()
HStack {
MoneyButton(value: 1000, viewModel: viewModel, moneyType: .bill)
MoneyButton(value: 5000, viewModel: viewModel, moneyType: .bill)
MoneyButton(value: 10000, viewModel: viewModel, moneyType: .bill)
}
.padding()
Button("金額をリセット") {
viewModel.resetAmount()
}
.padding()
}
}
}
enum MoneyType {
case coin
case bill
}
struct MoneyButton: View {
let value: Double
@StateObject var viewModel: SavingsViewModel
let moneyType: MoneyType
var body: some View {
Button("\(moneyType == .coin ? "硬貨" : "紙幣") ¥\(value)") {
viewModel.addAmount(value, for: moneyType)
}
.padding()
}
}
class SavingsViewModel: ObservableObject {
@Published var oneYenAmount: Double = 0.0
@Published var fiveYenAmount: Double = 0.0
@Published var tenYenAmount: Double = 0.0
@Published var fiftyYenAmount: Double = 0.0
@Published var fiveHundredYenAmount: Double = 0.0
@Published var coinAmount: Double = 0.0
@Published var billAmount: Double = 0.0
var totalAmount: Double {
oneYenAmount + fiveYenAmount + tenYenAmount + fiftyYenAmount + fiveHundredYenAmount + coinAmount + billAmount
}
func addAmount(_ amount: Double, for moneyType: MoneyType) {
switch moneyType {
case .coin:
switch amount {
case 1:
oneYenAmount += amount
case 5:
fiveYenAmount += amount
case 10:
tenYenAmount += amount
case 50:
fiftyYenAmount += amount
case 500:
fiveHundredYenAmount += amount
default:
coinAmount += amount
}
case .bill:
billAmount += amount
}
}
func resetAmount() {
oneYenAmount = 0.0
fiveYenAmount = 0.0
tenYenAmount = 0.0
fiftyYenAmount = 0.0
fiveHundredYenAmount = 0.0
coinAmount = 0.0
billAmount = 0.0
}
}
この例では、1円、5円、10円、50円、500円に対応するボタンを追加しました。それぞれの金額が適切にトラッキングされ、合計金額が表示されます。
追加できたかな?
できてるー!でも小数点以下が表示されてしまっている…。ということで修正。
CABO:小数点以下を表示しないようにしてください。
ChatGPT:理解しました。金額を整数として表示するように変更します。以下が修正されたコードです。
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject private var viewModel = SavingsViewModel()
var body: some View {
VStack {
Text("合計金額: ¥\(Int(viewModel.totalAmount))")
.padding()
HStack {
MoneyButton(value: 1, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 5, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 10, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 50, viewModel: viewModel, moneyType: .coin)
MoneyButton(value: 500, viewModel: viewModel, moneyType: .coin)
}
.padding()
HStack {
MoneyButton(value: 1000, viewModel: viewModel, moneyType: .bill)
MoneyButton(value: 5000, viewModel: viewModel, moneyType: .bill)
MoneyButton(value: 10000, viewModel: viewModel, moneyType: .bill)
}
.padding()
Button("金額をリセット") {
viewModel.resetAmount()
}
.padding()
}
}
}
enum MoneyType {
case coin
case bill
}
struct MoneyButton: View {
let value: Double
@StateObject var viewModel: SavingsViewModel
let moneyType: MoneyType
var body: some View {
Button("\(moneyType == .coin ? "硬貨" : "紙幣") ¥\(Int(value))") {
viewModel.addAmount(value, for: moneyType)
}
.padding()
}
}
class SavingsViewModel: ObservableObject {
@Published var oneYenAmount: Double = 0.0
@Published var fiveYenAmount: Double = 0.0
@Published var tenYenAmount: Double = 0.0
@Published var fiftyYenAmount: Double = 0.0
@Published var fiveHundredYenAmount: Double = 0.0
@Published var coinAmount: Double = 0.0
@Published var billAmount: Double = 0.0
var totalAmount: Double {
oneYenAmount + fiveYenAmount + tenYenAmount + fiftyYenAmount + fiveHundredYenAmount + coinAmount + billAmount
}
func addAmount(_ amount: Double, for moneyType: MoneyType) {
switch moneyType {
case .coin:
switch amount {
case 1:
oneYenAmount += amount
case 5:
fiveYenAmount += amount
case 10:
tenYenAmount += amount
case 50:
fiftyYenAmount += amount
case 500:
fiveHundredYenAmount += amount
default:
coinAmount += amount
}
case .bill:
billAmount += amount
}
}
func resetAmount() {
oneYenAmount = 0.0
fiveYenAmount = 0.0
tenYenAmount = 0.0
fiftyYenAmount = 0.0
fiveHundredYenAmount = 0.0
coinAmount = 0.0
billAmount = 0.0
}
}
この修正により、Textビューに表示される金額が整数として表示されます。
小数点以下が非表示になってるかな?
これで完成!貯金額の追加、確認、リセットが可能なアプリができた!
最後に
今回はChatGPTでアプリ開発第三弾をやってみました。いかがでしたでしょうか?もし「面白い!」「興味深い!」と思ったらスキとフォロー、何卒よろしくお願いします。