ios - 如何在 Swift 中正确地将 block 处理程序传递给此函数?

标签 ios closures objective-c-blocks swift

阅读 Swift 闭包并尝试使用相同的语法将匿名函数传递到处理程序后,我无法编译它。如何在 Swift 中正确地重新创建以下功能 objective-c 代码?

这是我试图在 swift 中重新创建的 objective-c 代码

 [self.motionManager
     startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
     withHandler:^(CMAccelerometerData *data, NSError *error)
     {

         dispatch_async(dispatch_get_main_queue(),
                        ^{

                            float xx = data.acceleration.x;
                            float yy = -data.acceleration.y;
                            float angle = atan2(yy, xx);

                            self.dropitBehavior.gravity.angle = angle;
                         });
     }
 ];

以下是一些在 swift 中重新创建代码的失败尝试:

self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: {
            (data: CMAccelerometerData(), error: NSError()) -> Void = {
                dispatch_async(dispatch_get_main_queue()) {
                    var xx = data.acceleration.x
                    var yy = -data.acceleration.y
                    var angle = atan2(yy, xx)

                    self.dropitBehavior.gravity.angle = angle
                }
            }
  })

self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: {
            (data: CMAccelerometerData(), error: NSError()) {
                dispatch_async(dispatch_get_main_queue()) {
                    var xx = data.acceleration.x
                    var yy = -data.acceleration.y
                    var angle = atan2(yy, xx)

                    self.dropitBehavior.gravity.angle = angle
                }
            }
 })

最佳答案

通过执行 CMAccelerometerData()NSError(),您实际上是在调用这些类的初始化程序。您只需要使用它们的类型。然而,因为在 objective-C 中,指针可以为 nil,当你将类型转换为 Swift 时,你需要使用可选类型。惯例是使用 Implicitly Unwrapped Optionals .此外,您使用 in 分隔匿名闭包的参数,而不是额外的大括号:

self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: {
    (data: CMAccelerometerData!, error: NSError!) in
    // internal implementation
})

此外,因为类型可以从参数类型中推断出来,所以您甚至不必指定参数的类型:

self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: {
    (data, error) in
    // internal implementation
})

此外,如果 block 是方法/函数调用的最后一个参数,您可以在括号外定义它:

self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) {
    (data, error) in
    // internal implementation
}

这样你就不需要在关闭之后关闭 )

使用您的内部实现创建最终版本:

self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) {
    (data, error) in
    dispatch_async(dispatch_get_main_queue()) {
        var xx = data.acceleration.x
        var yy = -data.acceleration.y
        var angle = atan2(yy, xx)

        self.dropitBehavior.gravity.angle = angle
    }
}

关于ios - 如何在 Swift 中正确地将 block 处理程序传递给此函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233191/

相关文章:

ios - 带有完成 block 的 NSOperation

ios - 'notes'字段在iOS通讯录App中是如何实现的?

javascript - JS 闭包和执行上下文的创建

ios - UIGestureRecognizer 的闭包

javascript - 为什么可以访问 "what-I-think-is-a-closure"中的变量?

ios - Objective-C block 参数类型推断

iOS 标签阴影

iphone - 在 glDrawArrays() 上调试 SIGKILL。苹果手机

iOS - 解释 CLHeading 的 x、y、z 值

objective-c - 在后台线程上执行时,CoreData 不处理删除