如何使用swift实现C-Style回调函数?

时间:2015-01-16 15:30:09

标签: objective-c swift callback iokit

我找到了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, &notification)

CFRunLoopAddSource (CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode);
   IOObjectRelease (displayWrangler);

上面的例子对我来说很清楚 - 到目前为止。但是IOServiceAddInteresNotification想要一个回调函数。通过在.m文件中的某处实现C-Style函数,可以很容易地执行此操作。

文档说我必须使用IOServiceInterestCallback类型的回调。

在C-Style中定义如下:

typedef void ( *IOServiceInterestCallback)( void *refcon, io_service_t service, uint32_t messageType, void *messageArgument );

在objC上,一切似乎都很完美。 什么是swift中的等效解决方案?如何在不为此创建C或objC文件的情况下声明回调函数?

有什么想法吗?

干杯,

杰克

1 个答案:

答案 0 :(得分:2)

由于闭包与CFunctionPointer不兼容,因此无法在Swift中创建类似回调的C函数。您可以在Objective-C或C中实现一些解决方法。示例在Objective-C Wrapper for CFunctionPointer to a Swift Closure

中描述