如何在Swift中使用自定义Object数组的reduce函数

时间:2014-06-15 22:43:08

标签: functional-programming swift

考虑具有简单属性class Sheep

的Swift对象var position: CGRect
class Sheep {
    var position: CGRect

    init() {
        position = CGRectZero
    }
}  

在一群绵羊中Array<Sheep>如何获得Sheep最高的position.origin.y

我尝试了以下内容,但获得了error: could not find member y

func firstSheep(sheeps: Array<Sheep>) -> Sheep
{
     return sheeps.reduce(sheeps[0]) {max($0.position.origin.y, $1.position.origin.y)}
}

所有类导入

import Foundation
import QuartzCore

1 个答案:

答案 0 :(得分:2)

max将返回一个CGFloat(无论哪个更大)。相反,您想要返回具有最高y值的绵羊:

return sheeps.reduce(sheeps[0]) {
    ($0.position.origin.y > $1.position.origin.y) ? $0 : $1
}

但要小心,因为如果sheeps为零,此方法将抛出运行时错误。我会将返回值设为可选,并执行以下操作:

func firstSheep(sheeps: [Sheep]) -> Sheep?
{
    let initial : Sheep? = nil
    return sheeps.reduce(initial) {
        if !$0 {
            return $1
        }
        return ($0!.position.origin.y > $1.position.origin.y) ? $0 : $1
    }
}

您需要将initial设置为单独的变量,以便按reduce中的泛型来正确。