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

ios – 如何在Swift中正确地将块处理程序传递给此函数?,第1张

概述在阅读了 Swift Closures并尝试使用相同的语法将匿名函数传递给处理程序之后,我无法进行编译.如何在Swift中正确地重新创建以下正常运行的目标c代码? 这是我试图在swift中重新创建的目标c代码 [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] 在阅读了 Swift Closures并尝试使用相同的语法将匿名函数传递给处理程序之后,我无法进行编译.如何在Swift中正确地重新创建以下正常运行的目标c代码?

这是我试图在swift中重新创建的目标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(),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.此外,您将匿名闭包的参数与其他大括号分开:

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

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

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

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

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中正确地将块处理程序传递给此函数?全部内容,希望文章能够帮你解决ios – 如何在Swift中正确地将块处理程序传递给此函数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1007033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存