Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

CFArrayはArrayと等価じゃなかった

XCode Version 7.1.1 (7B1005) Swift2.1で試しました。

CGWindowListCreateDescriptionFromArrayに[Int]を渡したところコンパイルが通ったのでCFArrayとArrayが等価だと思ってていたが使い方が間違っていたようなのでメモ

let windowArray = [1310]
let windowsdescription:CFArrayRef = CGWindowListCreateDescriptionFromArray(windowArray)!;
let windowInfos = windowsdescription as NSArray? as? [[String: AnyObject]]
print(windowInfos?.description)

1310のWindowがあるときに上のようなコードだと、windowInfosが空っぽになってしまう。

let windowIds = [1310]
let windowArray = CFArrayCreate ( nil, UnsafeMutablePointer<UnsafePointer<Void>>(windowIds), windowIds.count,nil)
let windowsdescription = CGWindowListCreateDescriptionFromArray(windowArray)!;
let windowInfos = windowsdescription as NSArray? as? [[String: AnyObject]]
print(windowInfos?.description)

のようにCFArrayを作ってから関数を呼ぶようにすると無事適切な値が帰ってくるようになった。 それっぽくコンパイルが通っても意図通りになっていないケースがあるのでObjectiveCの関数を呼ぶ時は注意が必要そうだ。