Sent from my iPad

> On Mar 2, 2017, at 6:56 PM, Tony Allevato via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> newtype feels like a leaky abstraction. Since the new type carries all the 
> protocol conformance and members of the original type, in your example, I 
> could add or divide RecordIds; but if they're database concepts, why would I 
> want to do that?
> 
> If the original type were extended to add members or protocols, would the 
> newtype gain those as well? It must, since types can be split into extensions 
> like that in Swift a priori. So the new type is always effectively a subtype 
> of the original, when what you often want is something that starts off with a 
> smaller subset of its operations instead, and people can extend it in ways 
> you don't expect.
> 
> I'm trying to imagine types where I automatically want *every* operation of 
> its originating type, and having trouble. Even for a unit-like API, there are 
> likely to be arithmetic operations that don't make sense.
> 
> I think a better model would be a general protocol forwarding mechanism for 
> existing type constructs. Then I could define RecordId as a struct, 
> internally it might have an underlying Int representation, but I would 
> explicitly state which protocols I wanted the type to conform to and which of 
> those are forwarded to that underlying Int. This allows us to maintain the 
> semantic importance of protocols and build types in a way that fits existing 
> Swift patterns, and without the magic/danger that newtype could provide.
> 
> The drawback is that if you want only a subset of operations in a protocol, 
> you don't get that easily for free. But you could define your own protocol, 
> retroactively conform the origin type to it *internally*, and then publicly 
> conform the new type and forward... and as far as I can tell, that plugs the 
> abstraction's leaks.

Agree.  I have shared a rough draft of a protocol-based forwarding proposal 
last year.  I was midway through a second draft when it became clear it was out 
of scope.  I'm planning to revive it when the time is right.

>> On Thu, Mar 2, 2017 at 4:08 PM Anton Zhilin via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 2017-03-03 2:13 GMT+03:00 Slava Pestov <spes...@apple.com>:
>> 
>> Does newtype add any new capability that’s not already covered by defining a 
>> struct?
>> newtype would forward all members and conformances of the underlying type:
>> 
>> newtype RecordId = Int
>> 
>> let x: RecordId = 5
>> let y = x + 10
>> 
>> extension RecordId {
>>     func load() -> String { … }
>> }
>> 
>> let a = x.load()
>> let b = 42.load()  // error
>> newtypes aim to carry purely semantic information, in this case, that those 
>> integers can be used to fetch records from a database. We get additional 
>> members only when we are sure that semantic of current instance is 
>> appropriate.
>> 
>> As a side effect, it essentially allows to declare one-liner structs with 
>> pattern matching. But I agree with Jaden, just adding pattern matching to 
>> structs feels more practical. And this feature is more or less orthogonal to 
>> the core functionality of newtype.
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to