ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Swift SDKを使ってTodoアプリを作る(その4:データを編集する)

f:id:mbaasdevrel:20210407131557p:plain

NCMBではSwift向けにSDKをリリースしています。最近ではiOSアプリを作る際にSwiftを利用することが増えていますので、その場合にはネイティブ言語で実装されているSwift SDKの利用をお勧めします。

そんなSwift SDKの使い方を知ってもらうためにも、ちょっとしたアプリ(Todoアプリ)を作ってみました。徐々に機能を追加していきますので、Swift SDKの利用法をぜひ覚えてください。

今回は前回のACL設定をベースとして、タスクの編集機能を追加します。

編集画面への遷移を追加

これまでリスト表示を行っていた部分を変更して、編集画面(EditView)への遷移を追加します。

List {
    ForEach(self.Todo.todos, id: \.objectId) { todo in
        NavigationLink(destination: EditView(delegate: self, objectId: todo.objectId!, text: (todo["body"] ?? "") as String)) {
            Text((todo["body"] ?? "") as String)
        }
    }
    .onDelete(perform: delete)
}

Delegateの追加

編集画面へのDelegateは次のようになります。

protocol EditViewDelegate {
    func editTodo(text: String, objectId: String)
}

また、このDelegateを ContentView に追加します。

struct ContentView: View, InputViewDelegate, EditViewDelegate {

編集画面の追加

f:id:mbaasdevrel:20210407131557p:plain

編集画面は次のようになります。リストから編集前のテキストと、objectIdを受け取っています。

struct EditView: View {
    @Environment(\.presentationMode) var presentation
    let delegate: EditViewDelegate
    @State var objectId: String
    @State var text: String
    var body: some View {
        VStack(spacing: 16) {
            TextField("タスクを編集してください", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            Button("編集") {
                delegate.editTodo(text: text, objectId: objectId)
                presentation.wrappedValue.dismiss()
            }
        }
        .padding()
    }
}

データを更新する

データを更新する処理 editTodo は ContentView に追加します。処理対象になるデータを検索し、そのbodyに新しいテキストを設定して更新します。更新後、リストのデータも新しいものに置き換えます。

func editTodo(text: String, objectId: String) {
    if let i = self.Todo.todos.firstIndex(where: { $0.objectId == objectId}) {
        let obj = self.Todo.todos[i]
        obj["body"] = text
        obj.saveInBackground(callback: { result in
            switch result {
                case .success(_):
                    self.Todo.todos[i] = obj
                case let .failure(error):
                    print("更新に失敗しました: \(error)")
            }
        })
    }
}

まとめ

これでTodoアプリの実装は完了です。データの追加と編集に削除、そしてタスクのACL設定まで行っています。認証とCRUD操作はどのようなアプリでも利用しますので、ぜひ応用して皆さんのアプリ開発に役立ててください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。