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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

0回答

955閲覧

UIColorをCodableに準拠するようにしたい

ponponpoo

総合スコア1

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/08/20 07:58

前提・実現したいこと

前回の続きです.
無事にsubViewと画像を保存することができました.

画像の保存に関しては,こちらを参考にして作成
させていただきました.

次は,画像に使用しているtintColorを保存したいのですが,UIColorもUIImage同様に
Codableに準拠させるために処理を挟まないとわかりました.

そこで,
① github
②スタックオーバーフロー
等を見つけたのですが,どのように自分のものに取り入れたらいいのかが
全くわかりません.

ご教授よろしくおねがいします.

試したこと

githubで紹介されてたものを取り入れようと思い,次のように書きました.
末尾に//があるものがgitHubから付け足したものになります.

swift

1 2class Labels: Codable { 3 var labelProperties = [LabelProperties]() 4} 5 6final class LabelProperties{ 7 8 let frame: CGRect 9 let image: UIImage? 10 let color: UIColor 11 12 init(frame: CGRect,image: UIImage?,color: UIColor) { 13 self.frame = frame 14 self.image = image 15 self.color = color 16 } 17} 18 19extension UserDefaults { 20 func setEncoded<T: Encodable>(_ value: T, forKey key: String) { 21 guard let data = try? JSONEncoder().encode(value) else { 22 print("Can not Encode to JSON.") 23 return 24 } 25 26 set(data, forKey: key) 27 } 28 29 func decodedObject<T: Decodable>(_ type: T.Type, forKey key: String) -> T? { 30 guard let data = data(forKey: key) else { 31 return nil 32 } 33 34 return try? JSONDecoder().decode(type, from: data) 35 } 36} 37 38extension LabelProperties: Codable { 39 40 // Decodable 41 enum CodingKeys: String, CodingKey { 42 case frame 43 case image 44 case color 45 } 46 47 convenience init(from decoder: Decoder) throws { 48 let values = try decoder.container(keyedBy: CodingKeys.self) 49 let decodedData = try values.decode(Data.self) // ① 50 let nsCoder = try NSKeyedUnarchiver(forReadingFrom: decodedData) // 51 52 let frame = try values.decode(CGRect.self, forKey: .frame) 53 //let color = try values.decode(UIColor.self, forKey: .color) 54 55 self.color = try UIColor(coder: nsCoder).unwrappedOrThrow() // 56 57 let imageDataBase64String = try values.decode(String.self, forKey: .image) 58 let image: UIImage? 59 if let data = Data(base64Encoded: imageDataBase64String) { 60 image = UIImage(data: data) 61 } else { 62 image = nil 63 } 64 self.init(frame: frame, image: image,color: color) 65 } 66 67 // Encodable 68 func encode(to encoder: Encoder) throws { 69 let nsCoder = NSKeyedArchiver(requiringSecureCoding: true) // 70 color.encode(with: nsCoder) // 71 72 var container = encoder.container(keyedBy: CodingKeys.self) 73 try container.encode(frame, forKey: .frame) 74 try container.encode(nsCoder.encodedData) // ② 75 76 if let image = image, let imageData = image.pngData() { 77 let imageDataBase64String = imageData.base64EncodedString() 78 try container.encode(imageDataBase64String, forKey: .image) 79 } 80 81 } 82 83}

エラー

上記のプログラムだと,①と②の箇所でエラーが出ます.
二箇所とも,

error

1Cannot invoke 'decode' with an argument list of type '(Data.Type)'

という,エラーが出ます.
このエラーはData.Typeだとdecodeに受け渡すことができない??という
意味なのでしょうか...?

よろしくおねがいします.

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問