用swift进行功能计算

时间:2014-11-21 13:55:08

标签: ios xcode swift functional-programming

  • 我有一个结构(跑道),由2个点组成 - 在这种情况下是Lat / Lon。
  • 我有一个有多条跑道的机场
  • 我想在swift
  • 中功能性地计算所有元素的边界框

我相信我可以使用reduce功能,但我并不是100%清楚如何做到这一点。我失败的尝试是:

runways.reduce(0, combine: { max($0.maxLat,$1.maxLat)})

但是我收到的错误是Double没有名为maxLat的成员...... ??

我也试过这个:

runways.reduce(0, combine: { max(((Runway)$0).maxLat,((Runway)($1)).maxLat)});

也不起作用。

我确定这是一个快速修复......任何人?

Playground-able code

struct Runway {
    let lat1 : Double
    let lat2 : Double
    let lon1 : Double
    let lon2 : Double
    let id1  : String
    let id2 : String


    var minLat : Double {
        get {
            return min(lat1,lat2)
        }
    }
    var minLon : Double {
        get {
            return min(lon1,lon2)
        }
    }

    var maxLat : Double {
        get {
            return max(lat1,lat2)
        }
    }

    var maxLon : Double {
        get {
            return max(lon1,lon2)
        }
    }

    init(Name n1 : String, Lat lat1 : Double, Lon lon1 : Double, Name n2 : String, Lat lat2 : Double, Lon lon2 : Double ) {
        self.id1 = n1;
        self.id2 = n2;
        self.lat1 = lat1;
        self.lat2 = lat2;
        self.lon1 = lon1;
        self.lon2 = lon2;
    }
}






///Airport class has min/max etc
class Airport {

    ///Airport Name
    let name : String

    ///Runway hodler array
    var runways : [Runway] = []

    func addRunway(rwy : Runway) {

        runways.append(rwy)
    }

    init (name : String) {
        self.name = name
    }


    func getMaxLat() {

        // Iterate through all runways and compare their max/mins

        // use reduce??

        // I'm confused!!
    }
}




/* Settings for Lancaster Airport */

//RWY 8
let lat8 : Double = 40.119946033333335
let lon8 : Double = 76.30404113333333

//RWY 26
let lat26 : Double = 40.12708346666667
let lon26 : Double = 76.2810583


//RWY 13
let lat13 : Double = 40.12317425
let lon13 : Double = 76.30378541666667

//RWY 31
let lat31 : Double = 40.11767828333333
let lon31 : Double = 76.29098628333334




var lancaster = Airport(name: "KLNS")

let Runway8_26 = Runway(Name: "8", Lat: lat8, Lon: lon8, Name: "26", Lat: lat26, Lon: lon26)

let Rnway13_31 = Runway(Name: "13", Lat: lat13, Lon: lon13, Name: "31", Lat: lat31, Lon: lon31)

lancaster.addRunway(Runway8_26);
lancaster.addRunway(Rnway13_31);


lancaster.getMaxLat()

1 个答案:

答案 0 :(得分:1)

你快到了那里:

func getMaxLat() -> Double {
    return runways.reduce(-DBL_MAX, combine: {
        max($0, $1.maxLat)
    })
}
组合闭包中的

$0是缩减的当前结果,在您的情况下是Double,而不是数组元素。 因此,代码中的$0.maxLat是错误的。

-DBL_MAX开始而不是0.0,可确保计算最大值 即使所有纬度都是负数,也要正确。