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

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

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

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

Q&A

解決済

1回答

322閲覧

codable時の値の変更について

helloray

総合スコア14

Swift

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

0グッド

0クリップ

投稿2018/12/20 07:00

前提・実現したいこと

swiftでアプリ開発をしている初心者です。

APIからJSONでデータを取得してるのですが
受信した値を変更したい場合うまくいかないので質問させていただきます。

例えば下記のようなデータがあるとして
name にtanakaと入ってきたら田中とデータを書き換えたいです。
エンコード後にfor文で名前のリストを比較する方法もあるかと思いますが、
データを変換時にできるならよりよいです。名前の変換リストは数が決まっています。

JSONの中身
"name" : "tanaka",
"age" : 20

struct Person: Codable{
enum CodingKeys: String, CodingKey {
case name
case age
}

enum Name: String, Codable {
ここに何かいれる?

}

var name: Name
let age : Int

ネットで見た方法でenumで実現しようと思いましたが、うまくいきませんでした。
初歩的で大変恐縮ですがご教示ください。

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

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

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

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

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

fuzzball

2018/12/20 07:13

「うまくいきませんでした」ということは、何かコードを書いて試したということですよね?そのコードを書いて下さい。
fuzzball

2018/12/20 07:18

コードは ``` で囲って下さい。また、手打ちせずにコピペして下さい。
helloray

2018/12/20 07:20

fuzzballさん 失礼しました。 そもそも間違いだと思い書きもしなかったのですが enum Name: String, Codable { case tanaka = "田中" } と入れましたが cannot initialize Name from inbalid String value tanaka とエラーがでました。 理解が足りずすみません。
guest

回答1

0

ベストアンサー

Decodableのイニシャライザの中で置換してやればいいのかな、と思いました。
お試しで、元の名前の後ろに@を付けるコードです。

swift

1struct Person: Codable { 2 var name: String 3 var age : Int 4 5 private enum CodingKeys: String, CodingKey { 6 case name 7 case age 8 } 9 10 init(from decoder: Decoder) throws { 11 let userInfo = decoder.userInfo 12 print("[userInfo]", userInfo) 13 let container = try decoder.container(keyedBy: CodingKeys.self) 14 name = try container.decode(String.self, forKey: .name) + "@" //後ろに@を付ける 15 age = try container.decode(Int.self, forKey: .age) 16 } 17}
入力

json

1[ 2 { 3 "name" : "tanaka", 4 "age" : 20 5 }, 6 { 7 "name" : "yamada", 8 "age" : 99 9 } 10]
出力

txt

1[ 2 { 3 "name" : "tanaka@", 4 "age" : 20 5 }, 6 { 7 "name" : "yamada@", 8 "age" : 99 9 } 10]

投稿2018/12/20 09:01

fuzzball

総合スコア16731

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

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

helloray

2018/12/25 01:09

fuzzball 様 ご教示ありがとうございます。 休暇中で返信が遅くなりました。 ご提示いただいたコードで同じ出力になりました。 実利用するコードは codingkeysが10個ほどあるのですが、 値の変更が必要ない項目もDecodableの際に記述が必要という認識で間違いないでしょうか。
fuzzball

2018/12/25 01:45

調べながら書いたので確かなことは言えないのですが、参考にしたいくつかの記事全て、変更の必要が無い項目も一つ一つデコードしていました。 まぁそうだろうなとは思いますが。
helloray

2018/12/25 02:32

実コードでうまくいきました! 簡潔に書くことを探しましたが、なさそうですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問