首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速解包值

快速解包值
EN

Stack Overflow用户
提问于 2017-03-26 01:04:12
回答 1查看 174关注 0票数 0

因此,我在解包和选项方面遇到了一些问题。我正在使用Google Places,并将place.formattedAddress值twice...first从GMSAutocompleteViewController传递给一个UIView,以便在一个字符串中显示。然后,我想在用户确认地点后将place.formattedAddress传递给Firebase。我可以将所选的GMSPlace传递给UIView,但是一旦我调用confirmAddPlace()函数,它就会在> let placeID2 = place.placeID行崩溃,并给出"terminating with uncaught of type NSException“。我相信这与展开和可选选项有关……我对这个概念还有些陌生。感谢大家的帮助!

代码语言:javascript
复制
// 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()
    }
EN

回答 1

Stack Overflow用户

发布于 2017-03-26 03:13:18

不要在中强制解包你的参数。您可以将它们设置为可选,也可以将它们用作其类型。

使其成为可选的:

代码语言:javascript
复制
func confirmAddPlace(place: GMSPlace?) {
    ...
    ...
    let placeID2 = place?.placeID
    ...
    ...
}

为了按原样使用它们的类型:(但为此,您必须使用未包装的值调用此函数,如:confirmAddPlace(myPlace!))

代码语言:javascript
复制
func confirmAddPlace(place: GMSPlace) {
    ...
    ...
    let placeID2 = place.placeID
    ...
    ...
}

但是如果你真的想坚持你的实现,那么你可以像这样交换:

代码语言:javascript
复制
guard let place = place else {
    return
}
let placeID2 = place.placeID

如果你传递的place有可疑之处,这将从你的函数返回

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43019297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档