2016-07-27 14 views
0

私は現在、住所をジオコーディングして座標に配置する必要があるプロジェクトを作成しています。ご覧のとおり、私はこれを行うために以下の機能を以下に作っており、機能しています。ただし、この関数で返される変数は、アプリケーションの残りの部分では更新されていないようです。以下は私のコードです。私がする必要がどのような非同期関数の後に値が更新されないのはなぜですか?

var startLat: Double! 
var startLong: Double! 

typealias theDouble = (Double, Double) ->() 

func forwardGeocodingStarting(address: String, completion: theDouble){ 
    //your code 
    let aVar: Double! 
    let bVar: Double! 

    let placemark = placemarks?[0] 
    let location = placemark?.location 
    let coordinate = location?.coordinate 
    aVar = (coordinate?.latitude)! 
    bVar = (coordinate?.longitude)! 
    completion(aVar, bVar) 
} 

// CALL THIS FUNCTION 

forwardGeocodingStarting(<your string address>) { firstVar, secondVar in 

    startLat = firstVar 
    startLong = secondVar 
    print("\(startLat) is lat and \(startLong) is long") //GET CORRECT VALUES 
} 

print(startLat) // GET "NIL" 
print(startLong) // GET "NIL" 



// ================= EDIT ============== 

      if startLat != 0 { 
      let startLatUnwrapped: Double = startLat 
     } 

     if startLong != 0 { 
      let startLongUnwrapped: Double = startLong 
     } 

は私のプロジェクト全体startLat & startLongを使用しているが、それは関数を呼び出す私の外に更新されていないようです。関数呼び出しの外でこれらの2つの変数を呼び出すと、nilが返されます。どんな助けでも大歓迎です。

+3

'forwardGeocodingStarting'は完了ブロックが時間の後半で呼ばれていることを意味し非同期に動作します。 2つの 'print'行、つまり値を処理するコードを他の' print'行のようにブロックに入れてください。 – vadian

答えて

0

非同期ブロックは、制御を瞬時に返します。だから、あなたは

print(startLat) 

を呼び出すときに、右非同期ブロックした後、それが更新された値を(この場合には、それがnilが含まれている)は含まれません。非同期ブロックの直後に変数を使用するのではなく、非同期閉包の終了時に変数を使用して/変数を使用するメソッドを作成することをお勧めします。

変数を安全に使用する別の方法は、変数がゼロかどうかをチェックすることです。変数を安全にアンラップするには、

if let 

を安全に使用することができます。

これが役に立ちます。ここで

EDIT

は、私が何を意味するのかである:

forwardGeocodingStarting(<your string address>) { firstVar, secondVar in 

    startLat = firstVar 
    startLong = secondVar 
    print("\(startLat) is lat and \(startLong) is long") //GET CORRECT VALUES 

    self.unwrapAndPrintCoordinates() 
} 

//Now, if anywhere in your code, you want to check if startLat and startLong 
//have values, you call this method 

func unwrapAndPrintCoordinates() { 

    //Unwrap startLat 
    if let startLatUnwrapped = startLat { 
     print(startLatUnwrapped) 
    } 

    //Unwrap startLong 
    if let startLongUnwrapped = startLong { 
     print(startLongUnwrapped) 
    } 
} 
+0

あなたの提案に対処するために私のコードの一番下に編集しましたが、それはうまくいかないようです。それはあなたがif letステートメントで何を意味するのですか? –

+0

オプションのアンバインドについては、Appleのマニュアルを参照してください。[こちら](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html) –

関連する問題