Вы можете использовать unsafeBitCast(_:to:)
для преобразования непрозрачного необработанного указателя в CFDictionary
. Обратите внимание, что вам также необходимо преобразовать второй параметр в необработанный указатель:
CFDictionaryGetValue(unsafeBitCast(window, to: CFDictionary.self), unsafeBitCast(kCGWindowName, to: UnsafeRawPointer.self))
unsafeBitCast (_: to:) указывает компилятору обрабатывать эту переменную как другой тип, однако это не очень безопасно (таким образом, префикс unsafe
), рекомендуя прочитать документацию для получения более подробной информации, особенно следующее примечание:
Внимание
Вызов этой функции нарушает гарантии системы типов Swift; используйте с особой осторожностью.
В вашем конкретном случае не должно быть проблем с использованием функции, так как вы работаете с соответствующими типами, как объявлено в документации к Foundation
функциям, которые вы вызываете.
Полный работоспособный код может выглядеть примерно так:
import CoreGraphics
let windows = CGWindowListCopyWindowInfo(CGWindowListOption.optionAll, kCGNullWindowID)
for i in 0..<CFArrayGetCount(windows) {
let windowDict = unsafeBitCast(CFArrayGetValueAtIndex(windows, i), to: CFDictionary.self)
let rawWindowNameKey = unsafeBitCast(kCGWindowName, to: UnsafeRawPointer.self)
let rawWindowName = CFDictionaryGetValue(windowDict, rawWindowNameKey)
let windowName = unsafeBitCast(rawWindowName, to: CFString?.self) as String?
print(windowName ?? "")
}