Как реализовать функции обратного вызова C-Style с помощью 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, &notification)

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

Приведенный выше пример мне понятен - пока. Но IOServiceAddInteresNotification хочет функцию обратного вызова. Это легко сделать, реализуя функцию C-Style где-то в .m-файле.

В документации сказано, что я должен использовать обратный вызов типа IOServiceInterestCallback.

В C-Style это определяется следующим образом:

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

А на objC вроде все отлично получается. Каково эквивалентное решение в Swift? Как объявить функцию обратного вызова, не создавая для этого файл C или objC?

Любые идеи?

Ваше здоровье,

Джек


person JackPearse    schedule 16.01.2015    source источник
comment
Типы функций Objective-C и Swift и блоков (замыканий) обычно взаимозаменяемы. Вы пытались написать быструю функцию, которая соответствует требуемой подписи, и использовать ее?   -  person Patrick Goley    schedule 16.01.2015
comment
Да, я уже пробовал эту идею. Но Swift жаловался на void* и uint32_t (которых не существует), почему мне не удалось это реализовать.   -  person JackPearse    schedule 16.01.2015
comment
IOServiceInterestCallback определен в swift. Знаете ли вы синтаксис, как использовать предопределенный прототип функции для реализации обратного вызова, используя что-то вроде func IOServiceInterestCallback displayPowerNotificationsCallback { (...) }   -  person JackPearse    schedule 16.01.2015


Ответы (1)


Вы не можете создавать функции C, такие как обратные вызовы в Swift, поскольку замыкания несовместимы с CFunctionPointer. Вы можете реализовать обходной путь в Objective-C или C. Пример описан в Оболочка Objective-C для CFunctionPointer для быстрого закрытия

person Kirsteins    schedule 16.01.2015
comment
Спасибо за этот ответ. Это означает, что мне всегда нужно использовать оболочки objC только для обратного вызова. Однако хорошо знать, что замыкания несовместимы с CFunctionPointer. - person JackPearse; 19.01.2015