Functional programming 如何在Swift中使用自定义对象数组的reduce函数
考虑到Swift对象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
类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
}
}