Re: [swift-evolution] Proposal: Add a sequence-based initializer to Dictionary

2018-01-09 Thread Brent Royal-Gordon via swift-evolution
> On Jan 8, 2018, at 3:23 PM, Gregg Wonderly via swift-evolution 
>  wrote:
> 
> But why wouldn’t the key also be available so that you might be able to have 
> selective handling of first vs last for each key?

Having only the values allows you to do some nice higher-order things, like:

let histogram = Dictionary(values.map { ($0, 1) }, uniquingValuesWith: 
+)

In other words, the same functions you could use with `reduce` can be used with 
`init(_:uniquingValuesWith:)`. If the function took a third parameter, we would 
lose this property.

There's a bunch of very reasonable things you can't do with 
`Dictionary(_:uniquingValuesWith:)`; for instance, you can't cause the 
initializer to fail by returning `nil`, only by throwing an error. Supporting 
these features would either complicate cases where you don't need them, or 
require us to provide another overload. Given that 
`Dictionary(_:uniquingValuesWith:)` and friends are just conveniences, and 
reimplementing them requires only a few lines of straightforward code, it's 
just not worth supporting every plausible variant.

(For what it's worth, the Swift Evolution proposal which added this 
initializer, [SE-0165 Dictionary & Set 
Enhancements](https://github.com/apple/swift-evolution/blob/master/proposals/0165-dict.md),
 touches on some of these issues. A big part of a proposal's role is to 
document the reasons for Swift's designs; if you ever wonder why something in 
Swift is designed the way it is, the feature's evolution proposal is a good 
place to start.)

-- 
Brent Royal-Gordon
Architechies

___
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution


Re: [swift-evolution] Proposal: Add a sequence-based initializer to Dictionary

2018-01-08 Thread Gregg Wonderly via swift-evolution
Okay, that does work for my example.  But why wouldn’t the key also be 
available so that you might be able to have selective handling of first vs last 
for each key?

Gregg

> On Jan 8, 2018, at 4:03 PM, Nate Cook  wrote:
> 
> Hi Gregg —
> 
> The Dictionary(_:uniquingKeysWith:) initializer was added for this purpose in 
> Swift 4—please see 
> https://developer.apple.com/documentation/swift/dictionary/2892961-init 
> 
> 
> Nate
> 
>> On Jan 8, 2018, at 1:02 PM, Gregg Wonderly via swift-evolution 
>> > wrote:
>> 
>> In some dictionary implementations, key-value pairs are added with an add() 
>> method which disallows duplicate keys to be inserted with a runtime 
>> exception.  Providing an additional method of set() allows for the ability 
>> to ignore duplicate keys so that it feels more like dict[key] = value.  It 
>> might be interesting to provide this as a selectable behavior within an 
>> additional constructor's arguments.  
>> 
>> Dictionary(allowDuplicate: true, pairs: [("z", 1), ("z", 2), ("z", 3), ("z", 
>> 4)]) so that the dictionary behavior remains in line with the compile time 
>> checks.
>> 
>> Gregg
>> 
>> ___
>> 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


Re: [swift-evolution] Proposal: Add a sequence-based initializer to Dictionary

2018-01-08 Thread Nate Cook via swift-evolution
Hi Gregg —

The Dictionary(_:uniquingKeysWith:) initializer was added for this purpose in 
Swift 4—please see 
https://developer.apple.com/documentation/swift/dictionary/2892961-init

Nate

> On Jan 8, 2018, at 1:02 PM, Gregg Wonderly via swift-evolution 
>  wrote:
> 
> In some dictionary implementations, key-value pairs are added with an add() 
> method which disallows duplicate keys to be inserted with a runtime 
> exception.  Providing an additional method of set() allows for the ability to 
> ignore duplicate keys so that it feels more like dict[key] = value.  It might 
> be interesting to provide this as a selectable behavior within an additional 
> constructor's arguments.  
> 
> Dictionary(allowDuplicate: true, pairs: [("z", 1), ("z", 2), ("z", 3), ("z", 
> 4)]) so that the dictionary behavior remains in line with the compile time 
> checks.
> 
> Gregg
> 
> ___
> 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


Re: [swift-evolution] Proposal: Add a sequence-based initializer to Dictionary

2018-01-08 Thread Gregg Wonderly via swift-evolution
In some dictionary implementations, key-value pairs are added with an add() 
method which disallows duplicate keys to be inserted with a runtime exception.  
Providing an additional method of set() allows for the ability to ignore 
duplicate keys so that it feels more like dict[key] = value.  It might be 
interesting to provide this as a selectable behavior within an additional 
constructor's arguments.  

Dictionary(allowDuplicate: true, pairs: [("z", 1), ("z", 2), ("z", 3), ("z", 
4)]) so that the dictionary behavior remains in line with the compile time 
checks.

Gregg

___
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution