> On 16 Mar 2017, at 21:48, Slava Pestov via swift-evolution 
> <[email protected]> wrote:
> 
> Hi Itai,
> 
> I’m wondering what the motivation is for keeping this as part of Foundation 
> and not the standard library. It seems like you’re landing an implementation 
> of this in the Foundation overlay on master, and another copy of all the code 
> will have to go into swift-corelibs-foundation. This seems suboptimal. Or are 
> there future plans to unify the Foundation overlay with corelibs-foundation 
> somehow?
> 
> Also the implementation uses some Foundation-isms (NSMutableArray, NSNumber) 
> and it would be nice to stick with idiomatic Swift as much as possible 
> instead.
> 
> Finally you should take a look at the integer protocol work 
> (https://github.com/apple/swift-evolution/blob/master/proposals/0104-improved-integers.md
>  
> <https://github.com/apple/swift-evolution/blob/master/proposals/0104-improved-integers.md>)
>  to replace the repetitive code surrounding primitive types, however I don’t 
> know if this has landed in master yet.
> 
> Slava

I agree that the protocols should be part of the standard library rather than 
Foundation. As far as I can make out, the only part of this proposal that 
actually requires Foundation is the use of the “Data” type (which itself is a 
strange and often frustrating omission from the standard library). The actual 
concrete encoders can live in Foundation.

Generally my opinion is that the proposed feature is nice. Everybody hates 
NSCoder and having to write those required initialisers on your UIViews and 
whatnot. At its core, it’s not really very different from any other Swift 
archiving library which exists today, except that it’s backed with layer upon 
layer of compiler-generated magic to make it less verbose. The things I don’t 
like:

1) While making things less verbose is commendable, automatically generating 
the encoding functions could be an anti-feature. “Codable” is for properties 
with persistable values only, which is a level of semantics which goes above 
the type-system. We don’t generate Equatable conformance for structs whose 
elements are all Equatable; it’s a big leap to go from “this data type is 
persistable” to “the value of this variable should be persisted” - for one 
thing, the value may not have meaning to others (e.g. a file-handle as an 
Int32) or it may contain sensitive user-data in a String. The encoding function 
isn’t just boilerplate - you *should* think about it; otherwise who knows what 
kind of data you’re leaking?

=> One possible solution would be to have “Codable" as a regular protocol, and 
refine it with “AutoCodable" which contains the magic. Just so there is a 
little extra step where you think “do I want this to be generated?”.

2) More generally, though, I don’t support the idea of the Foundation module 
introducing extensions to the Swift language that no other developer of any 
other module has the chance to do, with an aside that some reflection API which 
doesn’t exist yet might possibly make it less magic in the future. My jaw hit 
the floor when I saw this was part of the proposal, and that it wasn’t for the 
standard library. Could you imagine, if somebody proposed their own magic 
protocols for AlamoFire or Kitura or any other Swift library? It would be a 
non-starter. It *should* be a non-starter.

=> Do we have a policy about module-specific compiler magic such as this?
=> Can we move any of the magic (e.g. CodableKeys generation) to the standard 
library?

I develop a lot for platforms, or for scenarios, where Foundation is not 
supported nor desirable. Considering that people are taught to prefer library 
code to rolling their own, and that humans are generally quite receptive to 
shortcuts at the expense of correctness, if this machinery exists at all we can 
expect it to spread. It would totally kill libraries such as SwiftJSON or 
whatever else you currently use. The fact that such a fundamental and 
widespread feature would now live in a monolithic module I can’t access would 
significantly spoil the language for me.

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

Reply via email to