绑定必须具有可选的Swift类型

时间:2015-09-16 16:42:38

标签: ios swift

我收到此错误,我无法弄清楚如何修复它。我已经在这里完成了所有的答案,但我尝试的任何工作都没有。这是我的代码:

        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'

2 个答案:

答案 0 :(得分:9)

您报告错误:

  

条件绑定的初始化程序必须具有可选类型,而不是'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实施,如上所示。

答案 1 :(得分:-2)

这很有效。

如果让p =地标?[0]