前提・実現したいこと
前回の続きです.
無事に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に受け渡すことができない??という
意味なのでしょうか...?
よろしくおねがいします.
あなたの回答
tips
プレビュー