【问题标题】:Cannot convert value of type 'value' to expected argument type 'argument '无法将“值”类型的值转换为预期的参数类型“参数”
【发布时间】:2016-03-21 21:36:53
【问题描述】:

我目前正在尝试将我的 Swift iOS 应用程序转换为 Swift 2。我已经消除了 99% 的编译器错误,但这个仍然存在:

无法将 '(CMAltitudeData!, NSError!) -> Void' 类型的值转换为 预期的参数类型“CMAltitudeHandler”(又名 '(可选,可选) -> ()')

这是对这个函数的响应:

func startAltimeterUpdate() {
    self.altimeter.startRelativeAltitudeUpdatesToQueue(NSOperationQueue.currentQueue()!,
        withHandler: { (altdata:CMAltitudeData!, error:NSError!) -> Void in
            self.handleNewMeasure(pressureData: altdata)
    })
}

我很难理解这个错误...Xcode 到底想在这里告诉我什么?

【问题讨论】:

    标签: xcode swift swift2


    【解决方案1】:

    这很容易。

    -点击startRelativeAltitudeUpdatesToQueue获取符号文档。

    您将看到CMAltitudeHandler 处理程序被声明为

    CMAltitudeHandler = (CMAltitudeData?, NSError?) -> Void
    

    这两个参数都是可选的?,而不是隐式展开的可选!

    这就是错误消息的内容。

    【讨论】:

      【解决方案2】:

      您正试图强制一个可选项变为非可选项。斯威夫特不喜欢那样。相反,试试这个:

      func startAltimeterUpdate() {
          self.altimeter.startRelativeAltitudeUpdatesToQueue(NSOperationQueue.currentQueue()!,
              withHandler: { (altdata, error) -> Void in
                  if let data = altdata {
                      self.handleNewMeasure(pressureData: data)
                  } else {
                      // altdata is nil
                  }
          })
      }
      

      【讨论】:

      • 无需创建另一个数据常量。使用 if let altdata = altdata 甚至更好地使用 guard let altdata = alt data where error == nil else { return }
      • 啊,好吧,这很有意义。我的许多其他问题也与选项的处理有关。感谢您的快速回复!
      猜你喜欢
      • 2016-07-27
      • 2016-07-02
      • 1970-01-01
      • 2020-06-14
      • 2020-03-01
      • 2016-08-01
      • 2017-02-07
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多