“ひ to り go と” = zumuya の人が記事を書く所

RawRepresentable のままで Dictionary にアクセス

MacDev
enum MyKey: String
{
    case identifier
    case colorCode
}

func process(_ dictionary: [String: Any])
{
    let identifier = dictionary[MyKey.identifier.rawValue] as? String
    let colorCode = dictionary[MyKey.colorCode.rawValue] as? Int
    ...
}

この .rawValue を何度も書きたくなかったので extension を書いたという話。シンプルなコードなので誰が書いてもほぼ同じになりそう:

extension Dictionary
{
    subscript<WrappedKey: RawRepresentable>(_ key: WrappedKey) -> Value? where WrappedKey.RawValue == Key
    {
        get { return self[key.rawValue] }
        set { self[key.rawValue] = newValue }
    }
}
これがあると
let identifier = dictionary[MyKey.identifier] as? String
let colorCode = dictionary[MyKey.colorCode] as? Int
こうなる

もちろん最初から [MyKey: Any] にした方がきれいな状況であればその方がいいと思う。すっきりした勢いだけで書いた内容のない記事でした。

callback を登録解除できない IOKit のバグ

MacDev

IOKit で HID デバイスからデータを受け取るには IOHIDDeviceRegisterInputReportCallback() で callback を登録する。逆に callback の登録を解除したいときは専用の関数があるわけではなく Apple の資料によると

Note: To unregister pass NULL for the callback.

登録するときと同じ関数を、(callback: NULL) で呼べばいいらしい。

...と知ってからずっと試しているけど、どんな書き方をしても解除したはずの古い context で callback が呼ばれてしまい、アプリケーションがクラッシュ。

どうしようもないので IOKit のソースコードを読んでみることに。

→ 続きを読む