質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

906閲覧

[Swift]構造体をJSONEncoderでエンコードしてUserDefaultsに保存する方法

yasukun252

総合スコア34

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/09/27 19:23

編集2021/09/27 19:24

前提・実現したいこと

Swiftで以下のようなUserの構造体作成して、APIから返ってくるuserをJSONEncoderでエンコードしてUserDefaultsに保存する方法が分かりません。

Swift

1struct User: Decodable, Identifiable, Encodable { 2 var id: Int 3 var name: String 4 var email: String 5 var deleted_at: String? 6 var created_at: String 7 var updated_at: String 8}

APIの結果は以下のようになっております。

[Result]: success(Optional(6030 bytes)) status = "SUCCESS LOGIN"; user = { id = 1; name = test01; email = "test01@example.com"; "created_at" = "2021-03-04T06:31:57.896+09:00"; "updated_at" = "2021-03-07T20:43:18.051+09:00"; "deleted_at" = "<null>"; };

APIで返ってきているuserをUserDefaultsに保存してTextフィールドなどにuser.nameのように表示するやり方、方法が分かりません。

Swift

1AF.request("http://127.0.0.1:3000/login.json", 2 method: .post, 3 parameters: parameters, 4 encoder: JSONParameterEncoder.default) 5 .validate(contentType: ["application/json"]) 6 .responseJSON { response in 7 if response.response?.statusCode == 200 { 8 if let json = response.value as? NSDictionary { 9 print(json) 10 if json["status"] as? String == "SUCCESS LOGIN" { 11 12 // この部分にuserをJSONEncoderでエンコードしてUserDefaultsに保存する処理を書きたいです。 13 14 print("SUCCESS LOGIN") 15 } else if json["status"] as? String == "INVALID" { 16 debugPrint(response) 17 print("IN VALID") 18 } 19 } 20 } 21 }

API通信は上記のようにalamofireを利用して実装しております。

是非アドバイスなどよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こういう変換がしたいということですか?

swift

1if json["status"] as? String == "SUCCESS LOGIN" { 2 3 if let userDictionary = json["user"] as? NSDictionary { 4 print(type(of: userDictionary)) // __NSDictionaryI 5 6 if let userData = try? JSONSerialization.data(withJSONObject: userDictionary, options: .prettyPrinted) { 7 print(type(of: userData)) // Data 8 9 if let user = try? JSONDecoder().decode(User.self, from: userData) { 10 print(type(of: user)) // User 11 print(user.name) // test01 12 // User構造体のインスタンスなのでプロパティで値を取得できる 13 14 if let userJSON = try? JSONEncoder().encode(user) { 15 print(type(of: userJSON)) // Data 16 // JSONEncoderの結果 17 18 // userJSONをUserDefaultsに入れる 19 UserDefaults.standard.set(userJSON, forKey: "user") 20 UserDefaults.standard.synchronize() // 今すぐ同期する 21 } 22 } 23 } 24 } 25 26print("SUCCESS LOGIN") 27...

取り出す時:

swift

1if let userJSON = UserDefaults.standard.data(forKey: "user") { 2 if let user = try? JSONDecoder().decode(User.self, from: userJSON) { 3 print(type(of: user)) // User 4 print(user.name) // test01 5 } 6}

投稿2021/09/28 04:12

編集2021/09/28 05:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasukun252

2021/09/28 04:31

ご回答ありがとうございます!! 上記で書いて頂いたコードのuserJSONをUserDefaultsに保存して、Textフィールドなどにuser.emailみたいに表示したいです!!
退会済みユーザー

退会済みユーザー

2021/09/28 05:37

「…………保存して、Textフィールドなどにuser.emailみたいに表示したい」の流れがよく分からないんですが、とりあえず UserDefaults に入れる例と取り出す例は追記しておきました。 その適否は置いといて、もしかして違う画面で使ったりするために UserDefaults を経由する考えなのかもしれないと思ったので `synchronize()` が付いてます。
yasukun252

2021/09/28 22:58

すみません、取り出す時の部分に関してですが 違う画面で使ったりするために UserDefaults を経由するようにしたいのですが、違うView でTextフィールドなどに表示する処理はどのように書けば良いでしょうか? 以下のように書くとエラーになります。 struct OtherContentView: View { var body: some View { if let userJSON = UserDefaults.standard.data(forKey: "user") { if let user = try? JSONDecoder().decode(User.self, from: userJSON) { print(type(of: user)) // User print(user.name) // test01     Text(user.name)  <- ここの部分で「Type '()' cannot conform to 'View'」となります } } } } 「Type '()' cannot conform to 'View'」のエラーが表示されます。
退会済みユーザー

退会済みユーザー

2021/09/28 23:06

コメントで新しい前提の質問を始めないでください。同じ問題を抱える他の人間がコメントも対象に検索できると思いますか?
yasukun252

2021/09/29 01:07

すみません、大変失礼いたしました。その通りだと思います。 ありがとうございました! 再度、疑問点は新たな質問で作成するようにいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問