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

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

[Документация] (https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html#//apple_ref/doc/uid/TP40000970-CH214-SW61) говорит, что для отмены регистрации необходимо вызвать функцию регистрации с Null

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

К сожалению

IOHIDManagerRegisterInputValueCallback( hidManager, nil , nil);

не компилируется говоря:

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

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

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

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


person Jean    schedule 25.11.2016    source источник


Ответы (1)


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

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

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

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

IOHIDManagerRegisterInputValueCallback( hidManager, Optional.none , context);

Теперь программа компилируется и работает правильно.

person Jean    schedule 25.10.2017