2017-07-26 82 views
6

ben ...Swift kodlanabilir protokol ... kodlama/kod çözme NSCoding sınıfları

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) 
    } 
} 

bir Photo aşağıdaki yapı Kodlama var ... ile başarısız

Opsiyonel UIImage uymayan yapar çünkü encodable uymadığı

Kodlanabilir

Kod çözme başarısız…

Anahtar

NSCoding uygun NSObject alt sınıf özellikleri içerir Swift nesneleri kodlamak için bir yolu var mı)) " "\ görüntüyü" tuşuna \ kodlama için opsiyonel isteğe bağlı olmayan tip bekliyor ne zaman bulunamadı (UIImage, UIColor, vb.)?

+3

Sen ve Data' 'dan arşivden çıkarma/nesneleri arşivlemek özel kodlama/kod çözme kodu yazmak zorunda ... kodlama/kod çözme Data yönünde beni işaret @vadian için. Lütfen [Özel Türleri Kodlama ve Kod Çözme] 'nı okuyun (https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types) – vadian

cevap

7

Teşekkür

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

Sonuç olarak "Codable", "özel tipler" kullanıldığında daha kolay bir şey yapmaz. ? : - | – d4Rk

+0

Eh - 'NSObject' alt sınıfları (enum ve yapılar) –

+0

@AshleyMills kodlamak/kod çözme sağlar, bu hatayı alıyorum "Tür 'Fotoğraf' bu kodu kopyalanırken 'Decodable' protokolüne uymuyor dosya. –