It's a choice with overriding methods or provide a global function which's
missing @noescape version and has to write documentation to telling people
what's it doing.
However, sortBy method is common in other languages.
Dave Abrahams <dabrahams@apple.com> 於 2015年12月31日星期四 寫道:
···
You don’t. Is that a problem for the intended use-cases?
-Dave
On Dec 31, 2015, at 12:11 AM, Susan Cheng <susan.doggie@gmail.com > <javascript:_e(%7B%7D,'cvml','susan.doggie@gmail.com');>> wrote:
And how do you write a @noescape version with this function?
Dave Abrahams <dabrahams@apple.com
<javascript:_e(%7B%7D,'cvml','dabrahams@apple.com');>> 於 2015年12月31日星期四
寫道:I don’t understand that argument. Obviously the function would be
documented and there would be examples showing how to use it. Why would it
confuse people?I think you’d need much stronger reasons to justify adding an unbounded
set of overloads (is every algorithm that takes a comparison closure going
to get one of these?) when we can handle the problem economically with a
single function.-Dave
On Dec 31, 2015, at 12:04 AM, Susan Cheng <susan.doggie@gmail.com> wrote:
It confuses people if provide a global function byComparing in stdlib
which's doing nothing alone.Dave Abrahams <dabrahams@apple.com> 於 2015年12月31日星期四 寫道:
Why add all those algorithms when you can write this
func byComparing<T, U: Comparable>(getComparisonKey: (T)->U) -> (T, T)
-> Bool {
return { getComparisonKey($0) < getComparisonKey($1) }
}peoples.sort(byComparing { $0.name })
?
-Dave
On Dec 30, 2015, at 10:38 PM, Susan Cheng via swift-evolution < >>> swift-evolution@swift.org> wrote:
Consider the follows:
struct Person {
var name: String
var age: Int
}let peoples = [Person(name: "Hawk", age: 24), Person(name: "Andrew",
age: 23)]let youngest = peoples.minElement { $0.age < $1.age }
print(youngest?.name)
it's silly that we always have to write the code like { $0.some < $1.
some } or { some($0) < some($1) }so, we should add those methods to stdlib:
extension SequenceType {
/// Returns the minimum element in `self` or `nil` if the sequence
is empty.
///
/// - Complexity: O(`elements.count`).
///
@warn_unused_result
public func minElement<R : Comparable>(@noescape by:
(Generator.Element) throws -> R) rethrows -> Generator.Element? {
return try self.minElement { try by($0) < by($1) }
}
/// Returns the maximum element in `self` or `nil` if the sequence
is empty.
///
/// - Complexity: O(`elements.count`).
///
@warn_unused_result
public func maxElement<R : Comparable>(@noescape by:
(Generator.Element) throws -> R) rethrows -> Generator.Element? {
return try self.maxElement { try by($0) < by($1) }
}
}public extension MutableCollectionType {
/// Return an `Array` containing the sorted elements of `source`.
/// according to `by`.
///
/// The sorting algorithm is not stable (can change the relative
order of
/// elements that compare equal).
@warn_unused_result(mutable_variant="sortInPlace")
func sort<R : Comparable>(@noescape by: (Generator.Element) -> R)
-> [Generator.Element] {
return self.sort { by($0) < by($1) }
}
}public extension MutableCollectionType where Self.Index :
RandomAccessIndexType {/// Sort `self` in-place according to `by`.
///
/// The sorting algorithm is not stable (can change the relative
order of
/// elements that compare equal).
mutating func sortInPlace<R : Comparable>(@noescape by: (Generator.
Element) -> R) {
self.sortInPlace { by($0) < by($1) }
}
}_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution