Развертывание значений Swift
Так что у меня возникли некоторые проблемы с распаковкой и опциями. Я использую Google Places и дважды передаю значение place.formattedAddress... сначала из GMSAutocompleteViewController в UIView для отображения в строке. Затем я хочу передать адрес place.formattedAddress в Firebase после того, как пользователь подтвердит это место. Я могу передать выбранный GMSPlace в UIView, но затем, как только я вызываю функцию verifyAddPlace(), он вылетает при строке> let placeID2 = place.placeID и выдает мне "завершение с неперехваченным исключением типа NSException". Я полагаю, что это как-то связано с распаковкой и опциями... Я все еще немного новичок в этой концепции. Спасибо за любую помощь!
// 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()
}
1 ответ
Не заставляйте развернуть ваши параметры в func. Либо вы делаете их необязательными, либо используете их как тип.
Для изготовления необязательно:
func confirmAddPlace(place: GMSPlace?) {
...
...
let placeID2 = place?.placeID
...
...
}
Для использования их типа как есть: (но для этого вы должны вызвать эту функцию с развернутым значением, например: confirmAddPlace(myPlace!)
)
func confirmAddPlace(place: GMSPlace) {
...
...
let placeID2 = place.placeID
...
...
}
Но если вы хотите придерживаться своей реализации, вы можете просто поменять ее местами так:
guard let place = place else {
return
}
let placeID2 = place.placeID
Это вернется из вашего функционала, если что-то будет подозрительно с вашей передачей place