> On Apr 12, 2017, at 5:44 PM, Brent Royal-Gordon <[email protected]> 
> wrote:
> 
>> On Apr 12, 2017, at 11:44 AM, Russ Bishop via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> 
>> * String and Int keys being optional, giving a CodingKey the opportunity to 
>> return nil for both at runtime.
> 
> This was true in the first public draft, but I believe in this version 
> `stringValue` is no longer Optional.

You are correct; I still don't like the fact that you can be in an unkeyed 
archiver situation and hitting CodingKey adopters that don't provide integer 
keys. 

> 
>> * Encoder has three functions, but only one may ever be called. This API is 
>> the opposite of "pit of success".
> 
> Personally, I'm worried about that too. But I had a lot of trouble coming up 
> with an alternative that didn't violate a more important goal, like "being 
> able to throw errors" or "being compatible with classes".
> 
> Last-ditch suggestion: Change a bunch of names so that, for instance, 
> `Encoder` is instead `EncodingContainerizer`. (That's a terrible name, but 
> "Factory" gives me the hives.) That way, the name of the type gives you a 
> hint that you're supposed to use it to make a container. You might even 
> rename the methods to e.g. `useContainer(keyedBy:)`, which sound a little 
> more stateful and mutually-exclusive.
> 
>       func encode(to encoder: EncodingContainerizer) throws {
>               var container = encoder.useContainer(keyedBy: CodingKeys.self)
>               try container.encode(name, forKey: .name)
>               try container.encode(birthDate, forKey: .birthDate)
>       }

We could just completely separate the idea of keyed and unkeyed encoding?

You may be right that the downsides make an alternative design untenable.


> 
>> I don't understand why KeyedEncodingContainer needs all those overloads; 
>> automatic conformance to Encodable should be provided for the stdlib types 
>> in those overloads so why would they be necessary?
> 
> I argued about this pretty vigorously. They want to avoid the overhead of 
> building an encoder and single-value container and then making several 
> generic calls to encode the value into the container. Personally, I think 
> this is premature optimization of the highest order—particularly since 
> building an encoder and single-value container are often no-ops—but this is 
> the design they chose, and I don't think it's worth rejecting for that alone.

Has someone done performance tests to validate that this is an issue? If 
nothing else this seems like an implementation detail a conforming type could 
opt to provide but it shouldn't be required in every implementation.


> 
>> I really strongly dislike mixing up the Unkeyed and Keyed concepts. A type 
>> should need to explicitly opt-in to supporting unkeyed and that should be 
>> enforced at compile time. Unkeyed encoding is a potential versioning 
>> nightmare and should be handled with care.
> 
> I think they've done a reasonable job of putting unkeyed coding in a sharps 
> drawer by making you specifically ask for it and giving it an ugly name. 

Can you clarify what you mean? I see keyed and unkeyed spread across various 
protocols and types in the proposal. It's front and center. 

> 
>> C#'s serialization attributes are a better and more comprehensive solution 
>> but we don't have custom attributes in Swift and property behaviors were 
>> deferred. This problem is too important to leave to the future though. If we 
>> did ever add custom attributes or if property behaviors get implemented then 
>> this design could adopt them incrementally without breaking compatibility 
>> (e.g. a serialization transformer behavior that turns a non-Encodable 
>> property into an Encodable one, or a behavior that ignores a property for 
>> serialization purposes).
> 
> On the contrary, I think we *can* safely leave this to the future. If a 
> future version of Swift and Foundation added:
> 
>       @uncoded var foo: Bar
> 
> That would be a completely additive change. Until then, there's an irritating 
> but serviceable solution available—write your own CodingKeys enum and let 
> code generation write the `Codable` conformances based on it.

I didn't write that sentence clearly; I was aiming for your meaning that we can 
leave it for the future.


Russ

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to