为什么我不能在swift中使用双精度元组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 { 

我想如果语句在使用min(),但我得到的错误:为什么我不能在swift中使用双精度元组min()?

"Cannot invoke 'min' with an argument list of type (Double, Double)"

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

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

+0

如果你有一个坐标,为什么不使用'CGPoint'? – JAL

+1

如果您必须使用元组,您必须像这样访问每个元素:'min(boundingBoxLat.0,boundingBoxLat.1)' – JAL

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

我错过了什么吗?

是的。

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

在包括该SE-0029雨燕的版本,雨燕不接受两名成员作为函数两个参数实际参数的元组。

(没有为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 S和.1 s内混淆。

+0

这是关于最佳实践的好建议,谢谢。关于JAL的建议也非常有趣。 – Pigpocket