Я просматриваю документы для CFStringGetCString и AXUIElementCopyAttributeValue .
CFStringGetCString
принимает параметр buffer: UnsafeMutablePointer<Int8>!
AXUIElementCopyAttributeValue
принимает параметр value: UnsafeMutablePointer<CFTypeRef?>
Для последнего я могу позвонить так:
var value: CFTypeRef?
let err = AXUIElementCopyAttributeValue(element, attribute as CFString, &value);
Это удовлетворяет документ, запрашивающий UnsafeMutablePointer
типа CFTypeRef
.
ОднакоЯ не могу применить ту же логику, выполнив
let buffer: Int8!
CFStringGetCString(attribute as! CFString, &buffer, 2048, CFStringBuiltInEncodings.UTF8.rawValue)
Я также пытался
let buffer: Int8?
CFStringGetCString(attribute as! CFString, &buffer!, 2048, CFStringBuiltInEncodings.UTF8.rawValue)
В любом случае, он жалуется на использование buffer
до его инициализации, даже если онникогда не жаловался на value
в рабочем методе с аналогичными требованиями к параметрам.
Все рабочие примеры, которые я видел для CFStringGetCString
, используют синтаксис, похожий на target-c с *
.Не уверен, какой правильный быстрый путь здесь.
Я также пытался получить желаемое значение:
let app = AXUIElementCreateSystemWide();
var valueString = "";
var value: CFTypeRef?
// An exception on execution happens here when passing app
// Passing in the element I clicked instead of app
// yields error -25205 (attributeunsupported)
let err = AXUIElementCopyAttributeValue(app, "AXFocusedApplication" as CFString, &value);
if (err == AXError.success) {
valueString = value! as! NSString as String;
} else {
print("ERROR!");
print(err.rawValue);
}
return valueString;