swift – 成功地使Enum(具有关联类型)可编码

前端之家收集整理的这篇文章主要介绍了swift – 成功地使Enum(具有关联类型)可编码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我无法正确解码我的Codable类型.我已经阅读了一些关于使用相关类型制作Codable枚举的教程.我搜索过拼写错误,名称不匹配,或其他什么,但我无法发现任何错误.然而,每当我尝试对这些结构进行解码时(一个图层…这在扩展中的一个图层上定义了一个“属性”……但是图层的所有其他预定义部分都被正确地加/解码),我点击了解码(来自解码器:)方法中的“未找到密钥”异常.
  1. extension Layer {
  2.  
  3. struct Attribute: Codable {
  4.  
  5. enum Value: Codable {
  6.  
  7. case pulse(Double)
  8. case flash(Double)
  9. case draw(Double)
  10.  
  11. private enum CodingKeys: String,CodingKey {
  12. case pulse,flash,draw
  13. }
  14.  
  15. func encode(to encoder: Encoder) throws {
  16.  
  17. var container = encoder.container(keyedBy: CodingKeys.self)
  18.  
  19. switch self {
  20. case .pulse(let value):
  21. try container.encode(value,forKey: .pulse)
  22. case .flash(let value):
  23. try container.encode(value,forKey: .flash)
  24. case .draw(let value):
  25. try container.encode(value,forKey: .draw)
  26. }
  27. }
  28.  
  29. init(from decoder: Decoder) throws {
  30.  
  31. let values = try decoder.container(keyedBy: CodingKeys.self)
  32.  
  33. do {
  34. let value = try values.decode(Double.self,forKey: .pulse)
  35. self = .pulse(value)
  36. } catch (let error) {
  37. print(error)
  38. }
  39.  
  40. do {
  41. let value = try values.decode(Double.self,forKey: .draw)
  42. self = .draw(value)
  43. } catch (let error) {
  44. print(error)
  45. }
  46.  
  47. do {
  48. let value = try values.decode(Double.self,forKey: .flash)
  49. self = .flash(value)
  50. } catch (let error) {
  51. print(error)
  52. }
  53.  
  54. self = .draw(0.0)
  55. }
  56.  
  57.  
  58. }
  59.  
  60. var value: Value
  61.  
  62. init(value: Value) {
  63. self.value = value
  64. }
  65. }
  66. }
我认为在解码之前,你应首先检查解码器容器中是否存在密钥.目前,你这样做:
  1. do {
  2. let value = try values.decode(Double.self,forKey: .pulse)
  3. self = .pulse(value)
  4. } catch (let error) {
  5. print(error)
  6. }
  7.  
  8. do {
  9. let value = try values.decode(Double.self,forKey: .draw)
  10. self = .draw(value)
  11. } catch (let error) {
  12. print(error)
  13. }
  14.  
  15. do {
  16. let value = try values.decode(Double.self,forKey: .flash)
  17. self = .flash(value)
  18. } catch (let error) {
  19. print(error)
  20. }

解码器容器无法在那里拥有所有三个键,不是吗?

所以,解码前检查:

  1. if values.contains(.pulse) {
  2. do {
  3. let value = try values.decode(Double.self,forKey: .pulse)
  4. self = .pulse(value)
  5. return // remember to return here,so you don't set self back to .draw(0.0) again!
  6. } catch (let error) {
  7. print(error)
  8. }
  9. } else if values.contains(.draw) {
  10. do {
  11. let value = try values.decode(Double.self,forKey: .draw)
  12. self = .draw(value)
  13. return
  14. } catch (let error) {
  15. print(error)
  16. }
  17. } else if values.contains(.flash) {
  18. do {
  19. let value = try values.decode(Double.self,forKey: .flash)
  20. self = .flash(value)
  21. return
  22. } catch (let error) {
  23. print(error)
  24. }
  25. }

猜你在找的Swift相关文章