2016-11-25 12 views
1

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

код [документация] (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 (с) (опционально, 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); 
    } 
} 

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

ответ

0

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

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

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

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

IOHIDManagerRegisterInputValueCallback(hidManager, Optional.none , context); 

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