将 Swift 1.2 代码转换为 Swift 2

Converting Swift 1.2 code to Swift 2

我已经尝试了 15 分钟,试图弄清楚如何在 Swift 2 之前写的一本书中使用此代码,在 Xcode 7 应用程序中 Swift 2. 这是代码片段:

    self.coreMotionManager.accelerometerUpdateInterval = 0.3
self.coreMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: {

    (data: CMAccelerometerData!, error: NSError!) in

        if let constVar = error { 

 println("There was an error")
         }
         else {

             self.xAxisAcceleration = CGFloat(data!.acceleration.x)
         } })

我收到错误消息:“无法使用类型为‘(NSOperationQueue, withHandler: (CMAccelerometerData!, NSError!) -> _)’的参数列表调用 'startAccelerometerUpdatesToQueue'”

问题是 iOS SDK 已经针对可空性进行了进一步审核,因此那些在您书中的代码示例中隐式解包的参数现在是普通的旧可选参数(即使用 ? 而不是 !):

coreMotionManager.accelerometerUpdateInterval = 0.3
coreMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) { (data: CMAccelerometerData?, error: NSError?) -> Void in
    guard data != nil else {
        print("There was an error: \(error)")
        return
    }

    self.xAxisAcceleration = CGFloat(data!.acceleration.x)
}

或者,更简单地说,让编译器推断闭包参数的类型:

coreMotionManager.accelerometerUpdateInterval = 0.3
coreMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) { data, error in
    guard data != nil else {
        print("There was an error: \(error)")
        return
    }

    self.xAxisAcceleration = CGFloat(data!.acceleration.x)
}

而且,正如您在上面看到的,由于您使用的是 Swift 2,因此您也可以使用 guard 语法。