Swift3 GLGeocoder geocodeAddressString崩溃SWIFT 3

Swift3 GLGeocoder geocodeAddressString崩溃SWIFT 3,swift3,core-location,Swift3,Core Location,为什么只需对geocodeAddressString进行一次空调用,就可以得到EXC\u BAD\u指令: geocoder.geocodeAddressString(address, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in } as! CLGeocodeCompletionHandler) 您案例中的问题是错误是Swift 3中的错误参考,不再是NSError?。因此你

为什么只需对
geocodeAddressString
进行一次空调用,就可以得到
EXC\u BAD\u指令

geocoder.geocodeAddressString(address, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in 

} as! CLGeocodeCompletionHandler)

您案例中的问题是
错误
是Swift 3中的
错误
参考,不再是
NSError?
。因此你的强制施法失败了。您可以这样解决:

geocoder.geocodeAddressString(address, completionHandler: {(placemarks: [CLPlacemark]?, error: Error?) -> Void in

} as! CLGeocodeCompletionHandler)
但是那
as!不需要CLGeocodeCompletionHandler
。如果它建议使用该类型,可能只是因为它注意到您的闭包类型不正确

坦率地说,更简单的是,只要让它推断出正确的类型,您就不必担心此类问题:

geocoder.geocodeAddressString(address) { placemarks, error in 

}

尝试删除“as!”!CLGeocodeCompletionHandler',为什么强制强制强制转换?请参阅,因为Swift编译器一直将强制转换放入代码中。stackoverflow中的问题并没有解决我的问题。然后,对于您的问题,您需要提供更多输入。我想我也尝试了错误转换,但无论如何,您的第二个变体确实有效。。。谢谢。请确保您在回调中使用了[weak self],否则可能会崩溃。@Gargoyle-不,如果我们不执行
[weak self]
,它不会崩溃。使用
[无主自我]
很容易崩溃,但不仅仅是忽略
[弱自我]
。至于你是否使用
[弱自我]
,这仅仅是一个你是否需要保持对所讨论对象的强引用的问题。如果只是更新UI控件,那么
[弱自我]
是个好主意。但是,如果您也在做其他事情(例如更新模型或持久存储),那么保留强引用可能更合适。这取决于你在闭包中做了什么。如果你不使用“弱”,你将遇到地理代码开始的问题,然后用户导航离开视图控制器。如果你抓住了一个对自我的强烈引用,那么你就有了一个保留周期,就像VC拥有你和你拥有它一样。这根本不是真的。它只是一个强引用,但在地理代码调用完成或超时时就会得到解决。但这不是一个循环。是的,有时您绝对必须在闭包中使用弱引用来避免强引用循环(当对象对该闭包本身具有强引用时),但这不是其中之一。