I don’t get the resistance to Dave’s solution? I think it works well and much 
more applicable. Taking Susan’s original example, it’s not uncommon to want to 
sort or filter by multiple mechanisms.


func byComparing<T, U: Comparable>(getComparisonKey: (T)->U) -> (T, T) -> Bool {
    return { getComparisonKey($0) < getComparisonKey($1) }
}

struct Person {
    var name: String
    var age: Int
    var height: Int
}

let peoples = [
    Person(name: "Hawk", age: 24, height: 60),
    Person(name: "Andrew", age: 23, height: 66)
]

let youngest = peoples.minElement(byComparing { $0.age })
let tallest = peoples.maxElement(byComparing { $0.height })

print("youngest: \(youngest?.name ?? "<none>")")
print("tallest: \(tallest?.name ?? "<none>")")


-David

> On Dec 31, 2015, at 8:19 AM, Dave Abrahams via swift-evolution 
> <[email protected]> wrote:
> 
> 
>> On Dec 31, 2015, at 4:14 AM, Tino Heth <[email protected] <mailto:[email protected]>> 
>> wrote:
>> 
>> 
>>> func byComparing<T, U: Comparable>(getComparisonKey: (T)->U) -> (T, T) -> 
>>> Bool {
>>>   return { getComparisonKey($0) < getComparisonKey($1) }
>>> }
>> I've written something similar to bring file URLs into the order of their 
>> creation dates.
>> It is a small extension for collection types, and its only downside will 
>> disappear as soon as properties are accessible via method calls (afair there 
>> is a proposal in the making).
>> 
>> It was quite a lot fiddling with generics, and I don't have the tiny piece 
>> of code on my own computer, but it works in a way that you can do
>> let sorted = array.sortUsingAccessor(ElementType.methodThatReturnsComparable)
>> Beside the problems with properties, I really liked that approach.
> 
> This seems to be essentially the same design as Susan’s, and has the same 
> problem: it requires a new overload for every algorithm that takes a 
> comparison predicate.
> 
> -Dave
> 
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to