Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using JSONEncoder to encode a variable with Codable as type

I managed to get both JSON and plist encoding and decoding working, but only by directly calling the encode/decode function on a specific object.

For example:

struct Test: Codable {     var someString: String? }  let testItem = Test() testItem.someString = "abc"  let result = try JSONEncoder().encode(testItem) 

This works well and without issues.

However, I am trying to get a function that takes in only the Codable protocol conformance as type and saves that object.

func saveObject(_ object: Encodable, at location: String) {     // Some code      let data = try JSONEncoder().encode(object)      // Some more code } 

This results in the following error:

Cannot invoke 'encode' with an argument list of type '(Encodable)'

Looking at the definition of the encode function, it seems as if it should be able to accept Encodable, unless Value is some strange type I don't know of.

open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable 
like image 315
Denis Balko Avatar asked Jul 12 '17 08:07

Denis Balko


People also ask

Can a class conform to Codable?

If all the properties of a type already conform to Codable , then the type itself can conform to Codable with no extra work – Swift will synthesize the code required to archive and unarchive your type as needed.

How do you implement Codable?

The simplest way to make a type codable is to declare its properties using types that are already Codable . These types include standard library types like String , Int , and Double ; and Foundation types like Date , Data , and URL .

What does the Codable protocol do?

Codable allows you to insert an additional clarifying stage into the process of decoding data into a Swift object. This stage is the “parsed object,” whose properties and keys match up directly to the data, but whose types have been decoded into Swift objects.


1 Answers

Use a generic type constrained to Encodable

func saveObject<T : Encodable>(_ object: T, at location: String) {     //Some code      let data = try JSONEncoder().encode(object)      //Some more code } 
like image 195
vadian Avatar answered Sep 21 '22 18:09

vadian