Swift3 声明类变量时出现问题

Swift3 声明类变量时出现问题,swift3,Swift3,我正在我的项目中实现谷歌地图,因为MKLocalSearch没有餐厅/酒吧的完整列表。我正在关注谷歌的文档。我相信我已经发现了一个问题,并寻求如何解决的建议 第一步是在类级别声明变量: var locationManager = CLLocationManager() var currentLocation: CLLocation? var mapView: GMSMapView! var placesClient: GMSPlacesClient! var zoomLevel: Float =

我正在我的项目中实现谷歌地图,因为MKLocalSearch没有餐厅/酒吧的完整列表。我正在关注谷歌的文档。我相信我已经发现了一个问题,并寻求如何解决的建议

第一步是在类级别声明变量:

var locationManager = CLLocationManager()
var currentLocation: CLLocation?
var mapView: GMSMapView!
var placesClient: GMSPlacesClient!
var zoomLevel: Float = 15.0
按照剩余的说明操作后,我的程序在mapView行上继续失败:

let camera = GMSCameraPosition.camera(withLatitude: defaultLocation.coordinate.latitude,
                                      longitude: defaultLocation.coordinate.longitude,
                                      zoom: zoomLevel)
mapView = GMSMapView.map(withFrame: view.bounds, camera: camera)  //Fails here!
调试器中的错误消息为:致命错误:在展开可选值时意外发现Nil

所以问题是,为什么要以这种方式声明mapView变量?不是所有非可选变量都必须使用值初始化吗?我应该将变量声明为可选的吗?谷歌文档不正确对我来说似乎很奇怪。
谢谢。

通过使用声明可选选项!您告诉编译器,每当我访问此可选项时,它将有一个值。这意味着你不必坚持下去!每次你使用它的时候,它都在最后。但这确实意味着,如果您没有将optional设置为具有一个值,那么当您访问它时,将出现一个错误

例如,可以使用在viewDidLoad()中设置的UIViewController的类成员。您不需要为视图控制器设置单独的init()函数来初始化变量,但是您可以保证代码的入口点是viewDidLoad(),并且任何后续的代码运行都将具有该类成员的有效版本


搜索隐式展开的选项以获取更多详细信息

如果可能有或没有mapView,则应选择可选的mapView。你应该一直这样

 let mapView = GMSMapView(frame: self.view.bounds)

虽然查看代码时,您应该检查函数调用GMSMapView.map()的参数是否为零。