我想在 swift 中实现“天真的”排序。我正在这样做:
extension Array {
func sort<Element: Comparable>(isOrderedBefore: (Element, Element) -> Bool) -> [Element] {
var sortedArray : [Element] = []
for x in self {
for (index, value) in sortedArray.enumerate() {
if isOrderedBefore(x, value) {
}
}
}
return sortedArray
}
}
我遇到编译错误:“无法使用参数列表 '(Element, Element) 调用 isOrderedBefore
如果删除 Comparable 协议(protocol),代码可以编译,但如果数组元素不具有可比性,我就无法实现排序功能。
此代码编译:
extension Array {
func sort(isOrderedBefore: (Element, Element) -> Bool) -> [Element] {
var sortedArray : [Element] = []
for x in self {
for (index, value) in sortedArray.enumerate() {
if isOrderedBefore(x, value) {
}
}
}
return sortedArray
}
}
我做错了什么?
最佳答案
a) Array 符合 CollectionType 并间接符合 SequenceType b) 作为 SequenceType 的一部分,有默认的排序实现
extension SequenceType where Self.Generator.Element : Comparable {
/// Return an `Array` containing the sorted elements of `source`.
///
/// The sorting algorithm is not stable (can change the relative order of
/// elements that compare equal).
///
/// - Requires: The less-than operator (`func <`) defined in
/// the `Comparable` conformance is a
/// [strict weak ordering](http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings)
/// over the elements in `self`.
@warn_unused_result
public func sort() -> [Self.Generator.Element]
}
和
extension SequenceType {
/// Return an `Array` containing the sorted elements of `source`
/// according to `isOrderedBefore`.
///
/// The sorting algorithm is not stable (can change the relative order of
/// elements for which `isOrderedBefore` does not establish an order).
///
/// - Requires: `isOrderedBefore` is a
/// [strict weak ordering](http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings)
/// over the elements in `self`.
@warn_unused_result
public func sort(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) -> Bool) -> [Self.Generator.Element]
}
因此,如果默认实现对您来说不够(如果您对比较相等的元素的顺序有一些特殊要求),您可以遵循相同的场景
extension SequenceType where Self.Generator.Element : Comparable {
public func mySpecialSort() -> [Self.Generator.Element] {
...
}
}
和/或
extension SequenceType {
public func mySpecialSort(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) -> Bool) -> [Self.Generator.Element] {
...
}
关于swift - 函数和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433655/