为啥我不能在 Swift 的双精度元组上使用 min()?

Posted

技术标签:

【中文标题】为啥我不能在 Swift 的双精度元组上使用 min()?【英文标题】:Why can't I use min() on a tuple of doubles in Swift?为什么我不能在 Swift 的双精度元组上使用 min()? 【发布时间】:2017-08-16 00:46:01 【问题描述】:
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。

【问题讨论】:

如果有坐标,为什么不用CGPoint 如果你必须使用一个元组,你必须像这样访问每个元素:min(boundingBoxLat.0, boundingBoxLat.1) 【参考方案1】:

我错过了什么吗?

是的。

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

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

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 
    //...

您永远不会与.0s 和.1s 混淆。

【讨论】:

这是关于最佳实践的好建议,谢谢。关于 JAL 的建议也非常有趣。【参考方案2】:

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

【讨论】:

以上是关于为啥我不能在 Swift 的双精度元组上使用 min()?的主要内容,如果未能解决你的问题,请参考以下文章

在元组列表(SCALA)中将所有具有相同日期的双精度加起来

需要一种用户输入类型的方法:命令行程序的双精度[重复]

在 Scala 元组上使用功能组合器?

如何在元组上定义后缀运算符?

函数不能接受元组输入? [复制]

__saturatef() 内在函数没有等效的双精度