> On 17. Oct 2017, at 09:48, Jonathan Hull via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On Oct 17, 2017, at 12:04 AM, Gwendal Roué via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>>>> Modeling is, by definition, imperfect. The question is, what imperfect 
>>>> model is most useful _to Swift_. The idea is that conforming Set and 
>>>> Dictionary to Collection is on balance more useful than not doing so; that 
>>>> having two protocols, Sequence and Collection, is on balance more useful 
>>>> than having one or three, and that the set of semantic guarantees of 
>>>> Collection are on balance more useful than other possible sets of semantic 
>>>> guarantees.
>>> 
>>> That is your idea which is disputed and underlined with arguments whereas 
>>> you keep repeating that Set behaves as dictated by its conformance without 
>>> giving use cases why this should be useful.
>> 
>> Hello,
>> 
>> You can't *control* the ordering of a set or a dictionary, but you can still 
>> *rely* on it.
>> 
>> For example, to find a key in a dictionary that is associated a given value, 
>> you can rely on the fact that a dictionary's order is guaranteed to be 
>> stable, and that on top of that its indexes can address the dictionary 
>> itself, but also its keys and values sequences. The code below has no bug;
>> 
>> let dict = ["a": "foo", "b": "bar", "c": "needle"]
>> 
>> // Find a key associated with "needle"
>> if let index = dict.values.index(of: "needle") {
>>     let key = dict.keys[index]
>>     print(key) // prints "c"
>> }
> 
> You are using the index from one collection to index into another collection. 
>  Isn’t that something the documentation explicitly tells us not to do?  Or is 
> there a special (documented) guarantee that these collections will always 
> sync indices?

The documentation of Dictionary.values states that

"When iterated over, values appear in this collection in the same order as they 
occur in the dictionary’s key-value pairs."

and similarly for Dictionary.keys. So that should be safe, as I understand it.

Martin

> 
> I guess you could do:
> 
>       if let key = dict.first(where {$1 == “needle}).0 {
>               print(key)
>       }
> 
> …although note that which element is “first” if there are multiple keys with 
> needle as the value may shift around on you as you mess with the dictionary 
> (and also on separate runs even if you don’t mess with the dictionary).
> 
>> It's more difficult to find a use case for set's ordering and indexes. But 
>> since you ask, here is an example. The goal is to find any element which is 
>> not equal to another value, in any collection:
>> 
>> extension Collection where Element: Equatable {
>>     /// Returns any element which is not equal to the given element
>>     func anyElement(notEqualTo v: Element) -> Element? {
>>         if let i = index(of: v) {
>>             if let alt = index(i, offsetBy: 1, limitedBy: endIndex), alt != 
>> endIndex {
>>                 return self[alt]
>>             }
>>             if i == startIndex {
>>                 return nil
>>             }
>>             return first
>>         }
>>         return first
>>     }
>> }
>> 
>> Set([1, 2, 3]).anyElement(notEqualTo: 1) // 2 or 3
>> Set([1, 2]).anyElement(notEqualTo: 1)    // 2
>> Set([1]).anyElement(notEqualTo: 1)       // nil
>> Set([2]).anyElement(notEqualTo: 1)       // 2
>> Set([]).anyElement(notEqualTo: 1)        // nil
>> 
>> That *can* be useful, isn't it?
> 
> Yes, although this could easily be provided using iteration without indexing.
> 
> 
> Note that my current favorite solution is to simply provide an additional 
> guarantee on set/dictionary that the iteration order will always be the same 
> for the same contents (regardless of history), but the order would still be 
> otherwise arbitrary.  That is a non-source-breaking change (renaming IS 
> source breaking).  It won’t fix everything, but it will fix some of the 
> biggest gotchas.  As a bonus, elementsEqual will 'just work'™ for 
> sets/dictionaries. 
> 
> Thanks,
> Jon
> 
> 
> _______________________________________________
> 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