Как привести ноль к 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);
Программа теперь компилируется и, кажется, ведет себя правильно.