如何使用swift实现C-Style回调函数?
How to implement C-Style callback functions using swift?
我找到了 IOKit
的示例:
var notification:io_object_t
let matching:NSDictionary = IOServiceNameMatching("IODisplayWrangler").takeRetainedValue()
let displayWrangler = IOServiceGetMatchingService(kIOMasterPortDefault, matching)
let notificationPort = IONotificationPortCreate(kIOMasterPortDefault)
IOServiceAddInterestNotification(notificationPort, displayWrangler, kIOGeneralInterest, displayPowerNotificationsCallback, nil, ¬ification)
CFRunLoopAddSource (CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode);
IOObjectRelease (displayWrangler);
到目前为止,上面的例子对我来说很清楚。但是 IOServiceAddInteresNotification
想要一个回调函数。这样做很简单,只需在 .m
文件中的某处实现 C 样式函数即可。
文档说我必须使用类型为 IOServiceInterestCallback
的回调。
在C-Style中定义如下:
typedef void ( *IOServiceInterestCallback)( void *refcon, io_service_t service, uint32_t messageType, void *messageArgument );
在 objC 上,一切似乎都很完美。
swift 中的等价解是什么?如何在不为此创建 C 或 objC 文件的情况下声明回调函数?
有什么想法吗?
干杯,
杰克
您不能在 Swift 中创建类似回调的 C 函数,因为闭包与 CFunctionPointer
不兼容。您可以在 Objective-C 或 C 中实施一些解决方法。示例在 Objective-C Wrapper for CFunctionPointer to a Swift Closure
中描述
我找到了 IOKit
的示例:
var notification:io_object_t
let matching:NSDictionary = IOServiceNameMatching("IODisplayWrangler").takeRetainedValue()
let displayWrangler = IOServiceGetMatchingService(kIOMasterPortDefault, matching)
let notificationPort = IONotificationPortCreate(kIOMasterPortDefault)
IOServiceAddInterestNotification(notificationPort, displayWrangler, kIOGeneralInterest, displayPowerNotificationsCallback, nil, ¬ification)
CFRunLoopAddSource (CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode);
IOObjectRelease (displayWrangler);
到目前为止,上面的例子对我来说很清楚。但是 IOServiceAddInteresNotification
想要一个回调函数。这样做很简单,只需在 .m
文件中的某处实现 C 样式函数即可。
文档说我必须使用类型为 IOServiceInterestCallback
的回调。
在C-Style中定义如下:
typedef void ( *IOServiceInterestCallback)( void *refcon, io_service_t service, uint32_t messageType, void *messageArgument );
在 objC 上,一切似乎都很完美。 swift 中的等价解是什么?如何在不为此创建 C 或 objC 文件的情况下声明回调函数?
有什么想法吗?
干杯,
杰克
您不能在 Swift 中创建类似回调的 C 函数,因为闭包与 CFunctionPointer
不兼容。您可以在 Objective-C 或 C 中实施一些解决方法。示例在 Objective-C Wrapper for CFunctionPointer to a Swift Closure