为什么我不能在Swift的双元组中使用min()?

时间:2017-08-16 00:46:01

标签: swift double tuples min

var coordinatesDouble = (Double(latitudeTextField.text!), Double(longitudeTextField.text!))

var boundingBoxLat: (Double, Double)
var boundingBoxLon: (Double, Double)

boundingBoxLat = (coordinatesDouble.0! - Constants.Flickr.SearchBBoxHalfHeight, coordinatesDouble.1! + Constants.Flickr.SearchBBoxHalfHeight)
boundingBoxLon = (coordinatesDouble.1! - Constants.Flickr.SearchBBoxHalfWidth, coordinatesDouble.1! + Constants.Flickr.SearchBBoxHalfWidth)

if min(boundingBoxLat) < -90.0 {

我试图在if语句中使用min(),但收到错误:

  

“无法使用类型(Double,Double)的参数列表调用'min'”

我认为这是具体的功能。我错过了什么吗?

每个双精度的等式是减去或加到另一个双精度的一个双精度,导致双精度。然后if语句应该确定元组中的最低值是否低于-90.0。

2 个答案:

答案 0 :(得分:2)

我错过了什么吗?

YES。

请检查一下: SE-0029 Remove implicit tuple splat behavior from function applications

在包含此SE-0029的Swift版本中,Swift不接受两个成员的元组作为两个参数的函数的实际参数

min还有另一个重载,但这里无关紧要。)

如JAL所评论,您需要传递两个参数来调用min(_:_:)

min(boundingBoxLat.0, boundingBoxLat.1)

一些补充。

我想知道这条线是否真的是你想要的:

boundingBoxLat = (coordinatesDouble.0! - Constants.Flickr.SearchBBoxHalfHeight, coordinatesDouble.1! + Constants.Flickr.SearchBBoxHalfHeight)

应该是这样,不是吗? (请找到后半部分的小差异。):

boundingBoxLat = (coordinatesDouble.0! - Constants.Flickr.SearchBBoxHalfHeight, coordinatesDouble.0! + Constants.Flickr.SearchBBoxHalfHeight)

但是我的猜测是否正确并不重要。只是你应该知道这种使用元组太多的代码可读性较差。

我建议您定义自己的结构来表示 boundingBox

struct CoordinateBox {
    var minLatitude: Double
    var maxLatitude: Double
    var minLongitude: Double
    var maxLongitude: Double

    init(latitude: Double, longitude: Double, height: Double, width: Double) {
        assert(height > 0.0)
        assert(width > 0.0)
        minLatitude = latitude - height
        maxLatitude = latitude + height
        minLongitude = longitude - width
        maxLongitude = longitude + width
    }
}

let boundingBox = CoordinateBox(latitude: Double(latitudeTextField.text ?? "") ?? 0,
                                longitude: Double(longitudeTextField.text ?? "") ?? 0,
                                height: Constants.Flickr.SearchBBoxHalfHeight,
                                width: Constants.Flickr.SearchBBoxHalfWidth)

if boundingBox.minLatitude < -90.0 {
    //...
}

永远不会与.0.1 s混淆。

答案 1 :(得分:0)

元组可以将不同的数据类型混合在一起。如果所有数据类型都相同,则应使用数组。