为啥我不能在 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
//...
您永远不会与.0
s 和.1
s 混淆。
【讨论】:
这是关于最佳实践的好建议,谢谢。关于 JAL 的建议也非常有趣。【参考方案2】:元组可以将不同的数据类型混合在一起。如果所有数据类型都相同,则应使用数组。
【讨论】:
以上是关于为啥我不能在 Swift 的双精度元组上使用 min()?的主要内容,如果未能解决你的问题,请参考以下文章