Как привести ноль к IOKit.IOHIDValueCallback в Swift

Я пишу небольшую утилиту в Swift, которая регистрирует обратный вызов, используя IOHIDManagerRegisterInputValueCallback, Я пытаюсь быть хорошим гражданином и убирать за собой.

В [документации] ( https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html) говорится, что незарегистрированный следует вызвать функцию регистрации с Null

Примечание. Чтобы отменить регистрацию, передайте NULL для обратного вызова.

к несчастью

IOHIDManagerRegisterInputValueCallback( hidManager, nil , nil);

не компилирует высказывание:

Nil несовместим с ожидаемым типом аргумента 'IOHIDValueCallback' (он же @convention(c) (необязательно, Int32, необязательно, IOHIDValue) -> ()')

Как я могу привести ноль к правильному типу?

Вот пример кода, который должен скомпилироваться:

import Foundation
import Carbon
import IOKit
import IOKit.usb
import IOKit.hid
class IOEventManager{
  func start()->Void{
    let hidManager = IOHIDManagerCreate( kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone) );
    let context = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque());
    IOHIDManagerRegisterInputValueCallback( hidManager, nil, context);
  }
}

если вы хотите полный проект, зайдите на https://github.com/jeantil/autokbisw и посмотрите на IOKeyEventMonitor#deinit

1 ответ

Решение

Через некоторое время я снова открыл этот проект и, снова просматривая сигнатуру метода, заметил, что сигнатура быстрой привязки действительно ожидает IOHIDValueCallback? что означает необязательный IOHIDValueCallback

@available(OSX 10.5, *)
public func IOHIDManagerRegisterInputValueCallback(_ manager: IOHIDManager, _ callback: IOKit.IOHIDValueCallback?, _ context: UnsafeMutableRawPointer?)

Это не было очевидно для меня, потому что вы можете напрямую передать IOHIDValueCallback значение без явного переноса при вызове метода.

Замечание этого сделало решение очевидным:

IOHIDManagerRegisterInputValueCallback( hidManager, Optional.none , context);

Программа теперь компилируется и, кажется, ведет себя правильно.

Другие вопросы по тегам