无法转换类型的值'(数据: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?) -> 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) < idleThreshold && abs(data.acceleration.y) < idleThreshold && data.acceleration.z < -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>?”的值?到预期的参数类型“数据”