【问题标题】:Initializer For Conditional Binding Must Have Optional Type, not CLPlacemark条件绑定的初始化程序必须具有可选类型,而不是 CLPlacemark
【发布时间】:2016-09-23 14:57:04
【问题描述】:

这里是新手程序员。

我正在努力在互联网的帮助下成为一名优秀的程序员。所以,我订阅了 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)

            }
        }            
    }
}

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

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

    不要使用!。请改用if let

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我建议使用 guard 语句更进一步,并使用变量名 p 更详细一点... Guard 是退出当前流程的好方法,而不会用 if 语句弄乱你的代码,尤其是出现了“if let”可选的展开语法之后。

        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)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-03-11
          • 2017-01-22
          • 2018-03-25
          • 2016-01-08
          • 2017-04-08
          • 1970-01-01
          • 1970-01-01
          • 2017-09-19
          相关资源
          最近更新 更多