2016-11-25 45 views
1

我在swift中編寫了一個小實用程序,它使用IOHIDManagerRegisterInputValueCallback註冊了一個回調函數。我想成爲一個好公民,並在自己之後進行清理。如何在swift中將nil轉換爲IOKit.IOHIDValueCallback

[文檔](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); 

不會編譯說:

無不是與預期的參數類型 '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

回答

0

良久之後當我再次打開該項目,並在應聘一個方法簽名,我注意到,快速綁定的簽名實際上預計IOHIDValueCallback?這意味着可選IOHIDValueCallback

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

這對我來說並不明顯,因爲在調用方法時,您可以直接傳遞IOHIDValueCallback值而無需顯式包裝。

注意到本作的解決方案顯而易見:

IOHIDManagerRegisterInputValueCallback(hidManager, Optional.none , context); 

現在程序編譯,似乎可正常使用。