2017-07-26 1 views
6

私は、次の構造体を持っているのデコード...スウィフトコード可能なプロトコル...エンコーディング/ NSCodingクラス

struct Photo: Codable { 

    let hasShadow: Bool 
    let image: UIImage? 

    enum CodingKeys: String, CodingKey { 
     case `self`, hasShadow, image 
    } 

    init(hasShadow: Bool, image: UIImage?) { 
     self.hasShadow = hasShadow 
     self.image = image 
    } 

    init(from decoder: Decoder) throws { 
     let container = try decoder.container(keyedBy: CodingKeys.self) 
     hasShadow = try container.decode(Bool.self, forKey: .hasShadow) 

     // This fails 
     image = try container.decode(UIImage?.self, forKey: .image) 
    } 

    func encode(to encoder: Encoder) throws { 
     var container = encoder.container(keyedBy: CodingKeys.self) 
     try container.encode(hasShadow, forKey: .hasShadow) 

     // This also fails 
     try container.encode(image, forKey: .image) 
    } 
} 

PhotoをコードするUIImageが準拠 ていないため、オプションがコード化可能に準拠していない

...で失敗しますエンコード可能

デコードに失敗しました...

「画像\」\ コーディングキー用のオプションの非オプションタイプを期待するとき "が見つかりません

キー))

NSCodingに準拠NSObjectサブクラスのプロパティが含まれスウィフトオブジェクトをエンコードする方法はあります(UIImage,UIColorなど)?

+3

あなたがにしてData' 'からアーカイブしない/オブジェクトをアーカイブするためにカスタムのエンコード/デコードコードを記述する必要が...エンコード/デコードDataの方向に私を指して@vadianします。 [カスタムタイプのエンコーディングとデコード](https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types) – vadian

答えて

7

おかげで

class Photo: Codable { 

    let hasShadow: Bool 
    let image: UIImage? 

    enum CodingKeys: String, CodingKey { 
     case `self`, hasShadow, imageData 
    } 

    init(hasShadow: Bool, image: UIImage?) { 
     self.hasShadow = hasShadow 
     self.image = image 
    } 

    required init(from decoder: Decoder) throws { 
     let container = try decoder.container(keyedBy: CodingKeys.self) 
     hasShadow = try container.decode(Bool.self, forKey: .hasShadow) 

     if let imageData = try container.decodeIfPresent(Data.self, forKey: .imageData) { 
      image = NSKeyedUnarchiver.unarchiveObject(with: imageData) as? UIImage 
     } else { 
      image = nil 
     } 
    } 

    func encode(to encoder: Encoder) throws { 
     var container = encoder.container(keyedBy: CodingKeys.self) 
     try container.encode(hasShadow, forKey: .hasShadow) 

     if let image = image { 
      let imageData = NSKeyedArchiver.archivedData(withRootObject: image) 
      try container.encode(imageData, forKey: .imageData) 
     } 
    } 
} 
+1

最後に、 'Codable'は実際には何も簡単にしません。カスタムタイプを使用すると、 ? : - | – d4Rk

+0

これは、 'NSObject'以外のサブクラス(enums&structs)をエンコード/デコードすることができます –

+0

@AshleyMills、このエラーが発生しました"タイプ 'Photo'はプロトコル 'Decodable'に適合しません "ファイル。 –

関連する問題