【问题标题】:Binding must have optional type Swift绑定必须具有可选类型 Swift
【发布时间】:2015-09-16 16:42:37
【问题描述】:

我收到了这个错误,我不知道如何解决它。我已经浏览了这里的所有答案,但我尝试的任何方法都不起作用。这是我的代码:

        CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (placemarks, error ) -> Void in

            var title = ""

            if (error == nil) {

                if let p = CLPlacemark(placemark: placemarks![0] as! CLPlacemark){

                    var subThoroughfare:String = ""
                    var thoroughfare:String = ""

                    if p.subThoroughfare != nil{

                        subThoroughfare = p.subThoroughfare
                    }

                    if p.thoroughfare != nil{

                        thoroughfare = p.thoroughfare
                    }

                    title = "\(subThoroughfare) \(thoroughfare)"
                }
            }

            if title == ""{

                title = "Added \(NSDate())"

            }

错误在线:

                if let p = CLPlacemark(placemark: placemarks![0] as! CLPlacemark){

条件绑定的初始化程序必须具有可选类型,而不是“CLPlacemark”

【问题讨论】:

  • 不是抨击或任何东西,但这应该与 Fatal error: unexpectedly found nil while unwrapping an Optional value 一起出现在“不言自明的控制台消息万神殿中,可以准确地告诉您代码 (TM) 出了什么问题”

标签: ios swift


【解决方案1】:

你报错:

条件绑定的初始化程序必须具有可选类型,而不是“CLPlacemark”

这是因为您正在调用 CLPlacemark(placemark: CLPlacemark),但这并没有返回可选值。所以它抱怨你正在使用if let 语法,它只对可选值有效。

但是你真的不想强制解开placemarks,我建议你完全消除!。此外,鉴于在 Swift 2 中,placemarks 现在是 [CLPlacemark]?,您可以完全消除强制转换,从而简化 if 语句:

if let placemark = placemarks?.first {
    let subThoroughfare = placemark.subThoroughfare ?? ""
    let thoroughfare    = placemark.thoroughfare    ?? ""

    title = "\(subThoroughfare) \(thoroughfare)"
}

注意,您也可以简化 thoroughfaresubThoroughfare 实现,如上所示。

【讨论】:

    【解决方案2】:

    这行得通。

    如果让 p = 地标?[0]

    【讨论】:

    • 但如果数组为空,它将因“越界”错误而崩溃。这就是 Rob 在他的回答中使用 .first 而不是 [0] 的原因。
    猜你喜欢
    • 2015-09-29
    • 2018-01-12
    • 2018-11-06
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多