> On Apr 13, 2017, at 2:42 PM, David Hart via swift-evolution 
> <[email protected]> wrote:
> 
> It feels weird to me to jump through all these hoops just for backwards 
> compatibility. Seeing how even big projects might only have several 
> Comparable conformances, wouldn’t it be worth removing the default 
> implementation of compare and removing < from Comparable?

It isn’t just backwards compatibility.  As someone who has worked with both 
forms of comparable, I can say that just implementing ‘<‘ is much easier, 
especially when you are just chaining results of comparing components.  In one 
case I can just use ‘||' and ‘&&’, the other may require pattern matching in a 
switch. (I usually still have to implement ‘==‘ anyway in both cases, so it 
isn’t a difference between the two).

>> Different Names For compare and ComparisonResult
>> 
>> A few different variants for ComparisonResult and its variants were 
>> considered:
>> 
>> Dropping the ordered part of ComparisonResult’s cases e.g. .ascending
>> Naming of ComparisonResult as SortOrder
>> enum Ordering { case less, equal, greater } (as used by Rust 
>> <https://doc.rust-lang.org/std/cmp/enum.Ordering.html>)
>> Case values of inOrder, same, outOfOrder
>> The choice of case names is non-trivial because the enum shows up in 
>> different contexts where different names makes more sense. Effectively, one 
>> needs to keep in mind that the “default” sort order is ascending to map 
>> between the concept of “before” and “less”.
>> 
>> The before/after naming to provide the most intuitive model for custom sorts 
>> – referring to ascending or less is confusing when trying to implement a 
>> descending ordering. Similarly the inOrder/outOfOrder naming was too 
>> indirect – it’s more natural to just say where to put the element. If the 
>> enum should focus on the sorting case, calling it SortOrder would help to 
>> emphasize this fact.
>> 
> Can you give an example where ascending/descending/equal can be confusing?

Agreed.  Ascending & Descending imply an ordering to me.  I don’t see how the 
extra ‘ordered’ clarifies anything…

>> This proposal elects to leave the existing Foundation name in-place. The 
>> primary motivation for this is that use of the compare function will be 
>> relatively rare. It is expected that in most cases users will continue to 
>> make use of == or <, returning boolean values (the main exception to this 
>> will be in use of the parameterized String comparisons). As such, the source 
>> compatibility consequences of introducing naming changes to an existing type 
>> seems of insufficient benefit.
>> 
>> The method compare(_:) does not fully comport with the API naming 
>> guidelines. However, it is firmly established with current usage in 
>> Objective-C APIs, will be fairly rarely seen/used (users will usually prefer 
>> <, == etc), and alternatives considered, for example compared(to:), were not 
>> a significant improvement.
>> 
> Uses of the compare function might be rare, but I still think it should 
> follow the API naming guidelines. I don’t think that Objective-C conventions 
> are a strong enough argument to warrant breaking those guidelines, especially 
> in the Standard Library.

Agreed.

Thanks,
Jon

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

Reply via email to