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

时间:2016-05-25 20:09:25

标签: ios swift

Noob程序员在这里。

我正试图在互联网的帮助下成为一名优秀的程序员。所以,我订阅了Rob Percivals iOS类。我在使用这段代码时遇到了麻烦。一定是最近的更新,它使我的系统失败,尽管它与他的代码相同。

CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in

        if (error != nil) {

            print(error)

        } else {

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

            print(p)

            }
        }            
    }
}

如果可能的话,请尽量用英语写英文。谢谢!

3 个答案:

答案 0 :(得分:0)

placemarks的类型为[CLPlacemark]?。因此,您应该尝试以下内容:

if let placemarks = placemarks {
    if let p0 = placemarks.first {
        print (p0)
    }
}

不要使用!。请改用if let

答案 1 :(得分:0)

错误消息只是说初始值设定项CLPlacemark(placemark:)永远不会返回nil值,因此减少代码甚至删除类型转换,因为根据签名[CLPlacemark]?返回。不需要可选绑定,因为如果错误是nil,则保证阵列存在。

...
} else {
   if !placemarks!.isEmpty {
      let p = CLPlacemark(placemark: placemarks![0])
      print(p)
  }
}    

答案 2 :(得分:0)

我建议使用一个保护声明更进一步,并且使用变量名称p更加冗长... Guard是退出当前流程的好方法,而不会使代码混乱陈述,特别是因为“如果让...”可选的解包语法出现了。

CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in

    guard error == nil else {
        print(error)
        return
    }

    if let placemark = placemarks?.first {
         let currentPlacemark = CLPlacemark(placemark: placemark)
         print(currentPlacemark)
    }
}