2017-03-25 4 views
0

So habe ich einige Probleme mit dem Auspacken und Optionals. Ich verwende Google Places und übergebe den Wert "place.formattedAddress" zweimal ... zuerst von GMSAutocompleteViewController an eine UIView, die in einer Zeichenfolge angezeigt werden soll. Dann möchte ich die Place.formedAddress an Firebase übergeben, nachdem der Benutzer den Ort bestätigt. Ich bin in der Lage, das ausgewählte GMSPlace in die UIView zu übergeben, aber wenn ich die confirmAddPlace() - Funktion aufruft, stürzt es bei Zeile ab> let placeID2 = place.placeID und gibt mir die "ending mit nicht abgefangener Ausnahme vom Typ NSException". Ich glaube, es hat etwas mit Auspacken und Optionals zu tun ... Ich bin noch etwas neu in diesem Konzept. Danke für jede Hilfe!Auspacken Werte schnell

// Pass GMSPlace to UIView string 
    // MARK: GOOGLE AUTO COMPLETE DELEGATE 

    func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { 

     let placeID = place.placeID 

     placesClient.lookUpPlaceID(placeID, callback: { (place, error) -> Void in 
      if let error = error { 
       print("lookup place id query error: \(error.localizedDescription)") 
       return 
      } 

      guard let place = place else { 
       print("No place details for \(placeID)") 
       return 
      } 
      print("Place name \(place.name)") 
      print("Place address \(place.formattedAddress)") 
     }) 

     let selectedPlace = place.formattedAddress 
     if let name = selectedPlace as String! 
     { 
      self.placeNameLabel.text = "Are you sure you would like to add \(name) to your places?" 
     } 
     self.dismiss(animated: true, completion: nil) 
     setupConfirmationPopUp() 
    } 

// user taps confirm button to send item to be updated in Firebase 
    func confirmAddPlace(place: GMSPlace!) { 

     let accessToken = FBSDKAccessToken.current() 
     guard let accessTokenString = accessToken?.tokenString else { return } 

     let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString) 
     FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in 
      if error != nil { 
       print("Something went wrong with our FB user: ", error ?? "") 
       return 
     } 

// create place on tap pf confirm 
      let placeID2 = place.placeID 

      guard let place = place else { 
       print("No place details for \(placeID2)") 
       return 
      } 

      let confirmedPlace = place.formattedAddress 
      if let confirmedPlace = confirmedPlace as String! 
      { 
       self.placeNameLabel.text = "\(confirmedPlace)" 
      } 

      let ref = FIRDatabase.database().reference().child("places") 
      let childRef = ref.childByAutoId() 
      let values = ["place": self.placeNameLabel.text, "name": user!.displayName] 
      childRef.updateChildValues(values) 
    }) 
     animateOut() 
    } 

Antwort

0

nicht unwrap Ihre Parameter in func Zwingen Sie. Entweder Sie machen sie optional oder Sie verwenden sie als ihren Typ.

Zur Herstellung optional:

func confirmAddPlace(place: GMSPlace?) { 
    ... 
    ... 
    let placeID2 = place?.placeID 
    ... 
    ... 
} 

Für ihre Art mit wie: (aber dafür muss man mit ausgepackt Wert dieses func nennen, wie: confirmAddPlace(myPlace!))

func confirmAddPlace(place: GMSPlace) { 
    ... 
    ... 
    let placeID2 = place.placeID 
    ... 
    ... 
} 

Aber wenn Sie Möchten Sie bei Ihrer Implementierung bleiben, dann können Sie einfach wie folgt tauschen:

Dies wird von Ihrem func wenn etwas verdächtig ist mit Ihrer bestanden place

+0

Danke, aber ich habe sowohl GMSPlace und Ort Option wie in Ihrem ersten Vorschlag erwähnt und es stürzt immer noch. Ich habe auch die zweite Option mit dem Auspacken ConfirmAddPlace (selectedPlace!) Und immer noch kein Glück versucht ... – user3708224

+0

@ user3708224 können Sie versuchen, die dritte ?? – nayem

+0

yep - stürzt immer noch bei meinem AppDelegate ab und gibt mir das Beenden mit einer nicht abgefangenen Ausnahme vom Typ NSException error .... Ich frage mich, ob es einen einfacheren Weg gibt, den Namenswert aus dem self.placeNameLabel.text = "Bist du sicher du möchtest \ (name) zu deinen Orten hinzufügen? " String gespeichert in der Funktion viewController() ... ?? – user3708224