Functional programming 如何在Swift中使用自定义对象数组的reduce函数

Functional programming 如何在Swift中使用自定义对象数组的reduce函数,functional-programming,swift,Functional Programming,Swift,考虑到Swift对象类Sheep具有简单属性var位置:CGRect class Sheep { var position: CGRect init() { position = CGRectZero } } 在羊的数组数组中如何获得位置最高的羊。origin.y 我尝试了以下操作,但出现了一个错误:找不到成员y func firstSheep(sheeps: Array<Sheep>) -> Sheep { retur

考虑到Swift对象
类Sheep
具有简单属性
var位置:CGRect

class Sheep {
    var position: CGRect

    init() {
        position = CGRectZero
    }
}  
在羊的数组
数组中
如何获得位置最高的
。origin.y

我尝试了以下操作,但出现了一个
错误:找不到成员y

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

max
将返回CGFloat(以y较大者为准)。相反,您希望返回y值最高的羊:

return sheeps.reduce(sheeps[0]) {
    ($0.position.origin.y > $1.position.origin.y) ? $0 : $1
}
但是要小心,因为如果
sheeps
为nil,此方法将抛出运行时错误。我会将返回值设置为可选,并执行以下操作:

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
中的泛型以使其正确。

但我发现错误:类型“($T14,$T18)”不符合协议“LogicValue”@NicolasManzini您确定准确复制了吗?我在一个操场上很好地运行了这个代码确实没有:)我没有完全复制我犯了一个错误somewhere@NicolasManzini还要注意,如果
sheeps
不包含至少一个sheepyes,则此函数将抛出运行时错误。我正在尝试找出如何将默认参数设为零并返回一个sheepyes?变量
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
    }
}