Begin forwarded message:

> From: Itai Ferber <ifer...@apple.com>
> Subject: Re: [swift-users] dealing with heterogenous lists/dictionary with 
> Codable
> Date: October 19, 2017 at 9:39:25 AM PDT
> To: David Baraff <davidbar...@gmail.com>
> Cc: Geordie Jay <geo...@gmail.com>, swift-users <swift-users@swift.org>
> 
> Hi David and Geordie,
> 
> That approach won’t work — encoders and decoders only work directly with 
> concrete Codable types (e.g. String, Int, MyFoo [where MyFoo is Codable], 
> etc.).
> This is by design: since there is no type information stored in the JSON 
> payload, there isn’t necessarily a way to tell how to decode the type you’re 
> looking at, so asking for a generalCodable` isn’t helpful.
> 
> Since it’s unlikely that what you truly need is a [String : Any] but really a 
> [String : <one of String, Int, MyFoo, etc.>], one easy way to decode this 
> type is to create a wrapper enum or similar which overrides init(from:) to be 
> able to decode from one of those types. You can then ask to decode a [String 
> : MyWrapperType] and use that instead.
> 
> What types are you expecting in the dictionary?
> 
> 

The problem is that I want to be able to encode types T where
        (a) T is String, Int
        (b) lists of T
        (c ) dictionaries of type <String, T>

The problem is the recursive nature: yes, my types are simple (say only base 
types String and Int) but the “nesting” level may be quite deep (a list of list 
of dictionaries of <etc.).


Let’s turn this around:  in addition to the JSONEncoder, one can also use the 
PropertyListEncoder.  

Are we saying that something one could pull from a property list file (which is 
pretty much what i want: arbitrary deep nesting of basic types) is also not 
Codable?  So a PropertyListEncoder could not encode actual property lists?

I really do want a heterogenous container.  I think I am stuck.

> — Itai
> 
> On 19 Oct 2017, at 18:11, David Baraff via swift-users wrote:
> 
> I’ll try.  Is that cast smart enough to apply recursively? We shall see.
> 
> Sent from my iPad
> 
> On Oct 19, 2017, at 7:34 AM, Geordie Jay <geo...@gmail.com 
> <mailto:geo...@gmail.com>> wrote:
> 
>> I mean can you do something along the lines of
>> 
>> let codableDict = stringAnyDict as? [String : Codable]
>> 
>> ?
>> 
>> I’m not at a computer to test it myself
>> 
>> 
>> 
>> 
>> David Baraff <davidbar...@gmail.com <mailto:davidbar...@gmail.com>> schrieb 
>> am Do. 19. Okt. 2017 um 15:45:
>> That’s exactly what I want.  The ironic part is that I got my dictionary by 
>> decoding a Json file.  If that’s where my dictionary came from, is there a 
>> simple way of coercing the Json serialization routines to give me back 
>> codables, rather than Anys?
>> 
>> 
>> Sent from my iPad
>> 
>> On Oct 19, 2017, at 3:38 AM, Geordie Jay <geo...@gmail.com 
>> <mailto:geo...@gmail.com>> wrote:
>> 
>>> 
>>> David Baraff via swift-users <swift-users@swift.org 
>>> <mailto:swift-users@swift.org>> schrieb am Do. 19. Okt. 2017 um 03:47:
>>> So I have simple structs like this:
>>> 
>>>         struct Library: Codable {
>>>                 let domain: String
>>>                 let unit: String
>>>         }
>>> 
>>> and it’s super-simple to serialize.  Yay.
>>> 
>>> But:
>>> 
>>>         struct LibraryGroup : Codable {         // I wish...
>>>            let libraries: [Library]
>>>            let someDict: [String : Any]
>>>         }
>>> 
>>> I haven’t tried this, but is it possible to have a dictionary of [String : 
>>> Codable] ? Because that’s exactly the type requirements you’re describing, 
>>> no?
>>> 
>>> Geordie
>>> 
>>> 
>>> So what I’m looking for is something where if the values in someDict are 
>>> themselves Codable, I can serialize things, and if they’re not, I can’t.  
>>> In my previous scheme, I was using NSKeyedArchiver to serialize everything, 
>>> manualy, including someDict; in trying to switch to Codable I ran smack 
>>> into the fact that Codable wants to know what all the types are, in advance.
>>> 
>>> Am I just stuck?  How do I get the best of both worlds, where the compiler 
>>> can make use of the fact that it can see the data types of my structures, 
>>> while still being able to serialize heterogenous data like is found in 
>>> LibraryGroup?
>>> 
>>> Is my only alternative to write a custom coder for LibraryGroup?  Is there 
>>> any hope I could teach Codable what to do with
>>>         [String: Any]
>>> 
>>> ?
>>> 
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>> <https://lists.swift.org/mailman/listinfo/swift-users>
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users 
> <https://lists.swift.org/mailman/listinfo/swift-users>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to