2017-08-16 15 views
0
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文で分を()を使用しようとしていますが、エラーを取得しています:Swiftの2倍のタプルでmin()を使用できないのはなぜですか?

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

私がこの機能がためだった、特に何だと思いました。何か不足していますか?

各ダブルの式は、1つのダブルを減算するか、別のダブルに加算してダブルにします。 if文は、タプルの最低値が-90.0よりも低いかどうかを判断する必要があります。

+0

座標がある場合は、なぜCGPointを使用しないのですか? – JAL

+1

タプルを使用する必要がある場合は、次のように各要素にアクセスする必要があります。 'min(boundingBoxLat.0、boundingBoxLat.1)' – JAL

答えて

0

タプルは、異なるデータ型を混在させることができます。すべてのデータ型が同じ場合は、配列を使用する必要があります。

2

何か不足していますか?

はい。

これを確認してください:このSE-0029が含まスウィフトのバージョンでは SE-0029 Remove implicit tuple splat behavior from function applications

を、スウィフトは二つの引数を持つ関数の実際のパラメータとして、二つの部材のタプルを受け付けません。

(ありminのための別のオーバーロードがあるが、それはここでは無関係です。)

JALによりコメントとして、あなたはmin(_:_:)を呼び出すために2つの引数を渡す必要があります。

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

関連する問題