2016-09-04 3 views
3

Ich befolge ein Tutorial von raywenderlich.com zur Verwendung des Google Maps iOS SDK. Ich bin auf diesen Codeabschnitt gestoßen, der hier unten auf halber Strecke steht: https://www.raywenderlich.com/109888/google-maps-ios-sdk-tutorial.Was macht dieser Google Maps iOS SDK-Code in Swift?

Ich bin vertraut mit Swift, aber ich verstehe nicht, was das Stück Code nach geocoder.reverseGeocodeCoordinate (Koordinate) tut; Wie können Sie einfach die geschweiften Klammern direkt nach dem Methodenaufruf platzieren und was bewirkt sie? Ich frage das in Bezug auf die Swift-Syntax.

func reverseGeocodeCoordinate(coordinate: CLLocationCoordinate2D) { 

    // 1 
    let geocoder = GMSGeocoder() 

    // 2 
    geocoder.reverseGeocodeCoordinate(coordinate) { response, error in 
    if let address = response?.firstResult() { 

     // 3 
     let lines = address.lines as! [String] 
     self.addressLabel.text = lines.joinWithSeparator("\n") 

     // 4 
     UIView.animateWithDuration(0.25) { 
     self.view.layoutIfNeeded() 
     } 
    } 
    } 
} 

Antwort

0

Dies wird als "Trailing Closure" oder "Trailing Closure Syntax" bezeichnet. Es ist hier in Apples docs beschrieben:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID102

Zusammenfassend: Wenn der letzte Parameter einer Methode oder Funktion ein Verschluss ist, können Sie es unmittelbar nach dem Schließen zur Verfügung ) der Funktionsaufruf und die bisherigen Argumente. Beispiel:

func sendMessage(text:String, withCallback:(Bool)->()) { 
    // Implementation 
} 

let message = "hello" 
sendMessage(message) { 
    let result = $0 ? "Suceeded" : "Failed" 
    print(result) 
} 

Wenn eine Funktion nur einen Parameter übernehmen und dass Parameter ist ein Verschluss, dann brauchen Sie nicht () überhaupt zu benutzen und kann nur die Schließung unmittelbar nach dem Funktionsnamen übergeben. siehe zum Beispiel, wie diese Filtermethode heißt:

let boolArray = [true, true, false, true, false] 
let filtered = boolArray.filter { $0 == false } // Only the falses 
+0

Oh ich sehe, danke für die schnelle Antwort! – JoeW467

1

Es heißt ein trailing closure. Ein abschließender Abschluss ist ein Abschlussausdruck, der außerhalb der Klammern des Funktionsaufrufs geschrieben wird.

Die einzige Voraussetzung hier ist, dass die Schließung das letzte Argument der Funktion sein muss.

die folgende Funktion gegeben, sind diese beiden Anrufe identisch:

func someAPICall(url: String, completion: (Bool -> Void)) { 
    // make some HTTP request 
    completion(result.isSuccess) 
} 

someAPICall("http://httpbin.org/get") { success in 
    print("Success", success) 
} 

someAPICall("http://httpbin.org/get", completion: { success in 
    print("Success", success) 
}) 
+0

Danke für die ausführliche Antwort! – JoeW467