无法转换类型的值'(数据:CMAccelerometerData!,错误:NSError!)

Posted

技术标签:

【中文标题】无法转换类型的值\'(数据:CMAccelerometerData!,错误:NSError!)【英文标题】:Cannot convert value of type '(data: CMAccelerometerData!, err: NSError!)无法转换类型的值'(数据:CMAccelerometerData!,错误:NSError!) 【发布时间】:2016-06-24 00:20:01 【问题描述】:

这是否意味着它应该被打开?

无法将类型“(数据:CMAccelerometerData!,错误:NSError!)-> Void”的值转换为预期的参数类型“CMAccelerometerHandler”(又名“(可选,可选)->()”)

为什么 CMAccelerometerData 与 accelerometerUpdateHandler 不兼容?

    // error
    motionManager.startAccelerometerUpdatesToQueue(motionHandlingQueue, withHandler: accelerometerUpdateHandler())


    // snip

func accelerometerUpdateHandler() -> (data: CMAccelerometerData!, err: NSError!) -> Void 
    let idleThreshold = 0.1

    var log = [Double]()

    var samplingCountdown: Int = 0

    return  (data: CMAccelerometerData!, err: NSError!) -> Void in

        let _stable = abs(data.acceleration.x) < idleThreshold && abs(data.acceleration.y) < idleThreshold && data.acceleration.z < -0.75

【问题讨论】:

试试CMAccelerometerData?, err: NSError?) 只要使用guard let data = data where error == nil else return 试试motionManager.startAccelerometerUpdatesToQueue(motionHandlingQueue, withHandler: accelerometerHandler) func accelerometerHandler(data: CMAccelerometerData?, error: NSError?) -&gt; Void let idleThreshold = 0.1 var log = [Double]() var samplingCountdown: Int = 0 guard let data = data where error == nil else return let _stable = abs(data.acceleration.x) &lt; idleThreshold &amp;&amp; abs(data.acceleration.y) &lt; idleThreshold &amp;&amp; data.acceleration.z &lt; -0.75 // the rest of your code 在类的文档中查找实际签名。这是修复此类错误的常用方法。 【参考方案1】:

如下定义你的 accelerometerHandler:

func accelerometerHandler(data: CMAccelerometerData?, error: NSError?) -> Void 
    guard let data = data where error == nil else  return 
    let idleThreshold = 0.1
    var log = [Double]()
    var samplingCountdown: Int = 0
    let _stable = abs(data.acceleration.x) < idleThreshold && abs(data.acceleration.y) < idleThreshold && data.acceleration.z < -0.75
    // the rest of your code


调用时:

motionManager.startAccelerometerUpdatesToQueue(motionHandlingQueue, withHandler: accelerometerHandler)

【讨论】:

我注意到与您在 cmets 中的原始答案相比,guard 位于不同的位置。它在哪里重要吗? 只需要在使用数据之前完成。我通常将它们放在其余代码之前 如果数据不是nil,实际上错误总是nil,反之亦然,所以where子句是多余的。 @vadian 你是说我能写就像guard let data else return @tymac 是的,您可以 (guard let data = data else...),但我会添加一行以将潜在错误打印到控制台中。

以上是关于无法转换类型的值'(数据:CMAccelerometerData!,错误:NSError!)的主要内容,如果未能解决你的问题,请参考以下文章

无法转换类型“字典<String, Any>?”的值?到预期的参数类型“数据”

无法将“字符串”类型的值转换为预期的参数类型“数据”

无法将“UINavigationController”类型的值转换为 tabBarController

无法将类型“()”的值转换为预期的参数类型“字符串”

Swift“无法将''类型的值转换为'String'类型

无法将“[String : String?]”类型的值转换为预期的参数类型“String”