Cara memasukkan nihil ke IOKit.IOHIDValueCallback dengan cepat

Saya menulis sebuah utilitas kecil di Swift yang mendaftarkan panggilan balik menggunakan IOHIDManagerRegisterInputValueCallback. Saya mencoba menjadi warga negara yang baik dan membersihkan diri saya sendiri.

[Dokumentasi] (https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html#//apple_ref/doc/uid/TP40000970-CH214-SW61) mengatakan bahwa untuk membatalkan pendaftaran seseorang harus memanggil fungsi pendaftaran dengan Null

Catatan: Untuk membatalkan pendaftaran, berikan NULL untuk panggilan balik.

Sayangnya

IOHIDManagerRegisterInputValueCallback( hidManager, nil , nil);

tidak dikompilasi dengan mengatakan:

Nil tidak kompatibel dengan tipe argumen yang diharapkan 'IOHIDValueCallback' (alias '@convention(c) (Opsional, Int32, Opsional, IOHIDValue) -> ()')

Bagaimana saya bisa memasukkan nil ke tipe yang benar?

Berikut adalah contoh kode yang harus dikompilasi:

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);
  }
}

jika Anda ingin proyek lengkap, periksa https://github.com/jeantil/autokbisw dan lihat IOKeyEventMonitor#deinit


person Jean    schedule 25.11.2016    source sumber


Jawaban (1)


Setelah beberapa lama saya membuka proyek itu lagi dan ketika membaca kembali tanda tangan metode, saya perhatikan bahwa tanda tangan dari pengikatan cepat sebenarnya mengharapkan IOHIDValueCallback? yang berarti IOHIDValueCallback opsional

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

Bagi saya ini tidak terlihat jelas karena Anda dapat langsung meneruskan nilai IOHIDValueCallback tanpa pembungkusan eksplisit saat memanggil metode.

Memperhatikan hal ini membuat solusinya menjadi jelas:

IOHIDManagerRegisterInputValueCallback( hidManager, Optional.none , context);

Program sekarang dikompilasi dan tampaknya berfungsi dengan baik.

person Jean    schedule 25.10.2017