簡體   English   中英

展開值迅速

[英]Unwrapping values swift

所以我在解包和可選時遇到了一些問題。 我正在使用Google Places,並將place.formattedAddress值兩次傳遞...首先從GMSAutocompleteViewController傳遞到要在字符串中顯示的UIView。 然后,我想在用戶確認位置后將place.formattedAddress傳遞給Firebase。 我可以將所選的GMSPlace傳遞到UIView中,但是一旦我調用了verifyAddPlace()函數,它就會在行>>上崩潰,讓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()
    }

不要在func中強制解開參數。 您可以將它們設為可選,也可以將它們用作它們的類型。

對於可選:

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

按原樣使用它們的類型:(但為此,您必須使用未包裝的值調用此func,例如: confirmAddPlace(myPlace!)

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

但是,如果您確實想堅持自己的實現,則可以像這樣交換:

guard let place = place else {
    return
}
let placeID2 = place.placeID

如果您對通過的place有疑問,這將從您的功能中返回

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM