【发布时间】:2014-10-09 04:26:35
【问题描述】:
作为学习 Swift 的练习,我尝试使用名为 comparest 的共享方法在 Array 上创建最小和最大扩展方法。一切都经过测试并且运行良好,除了一件事:我不能在没有参数的情况下使用 minimum 函数。我已经指定了一个默认参数值nil,但是当我在没有这个参数的情况下调用minimum 时,Apple 的 Swift 编译器不喜欢它。
这是我的方法定义。它们编译得很好。
extension Array {
func comparest<C: Comparable>(comparator: T -> C, _ op: (C, C) -> Bool) -> T? {
var min = self.first
for elem in self {
if op(comparator(elem), comparator(min!)) {
min = elem
}
}
return min
}
func minimum<C: Comparable>(var _ comparator: (T -> C)? = nil) -> T? {
if comparator == nil {
comparator = { elem -> C in elem as C }
}
return self.comparest(comparator!, { $0 < $1 })
}
}
(如果您想知道为什么我说comparest(comparator!, { $0 < $1 }) 而不是comparest(comparator!, <),请查看我的related question。)
如果我说
var array = [3, 4, 1, 9]
var min = array.minimum({ $0 })
一切正常。但是,我设计了这种方法,以便可以省略传递给最小值的参数,在这种情况下,数组元素本身用作比较值,例如
var array = [3, 4, 1, 9]
var min = array.minimum()
编译器讨厌这个。它说“无法将表达式的类型 () 转换为 Int?”。我在这里一无所知。有什么想法吗?
(顺便说一句,参数的原因是如果您想通过属性值比较对象,例如,routes.map( { $0 as MKRoute }).minimum({ $0.distance }) 将为您提供最短距离的路线。)
【问题讨论】:
标签: swift