AXObserverCallback可以转换为Swift吗?我遇到的问题似乎与void *有关,我知道它不是Swift中的有效类型。
我试图将Obj-C代码转换为Swift,我无法获得编译代码。我不确定AXObserverCallback是否可以转换。 Objective-C声明是:
typedef void (*AXObserverCallback)( AXObserverRef observer, AXUIElementRef element, CFStringRef notification, void *refcon);
AXObserverCallback没有Swift声明。设置AXObserver的另一个相关功能是AXObserverCreate,其中有Obj-C和Swift的声明。
工作Obj-C代码的简化版本是:
- (AXError)installWindowCreatedAXObserver {
pid_t pid = 0;
AXObserverRef observer = NULL;
AXError axErr = AXObserverCreate(pid, windowCreatedCallback, &observer);
return axErr;
}
void windowCreatedCallback(AXObserverRef observer, AXUIElementRef element, CFStringRef notificationName, void *refCon) {
NSLog(@"windowCreatedCallback");
}
我尝试转换为Swift是:
func installWindowCreatedAXObserver() -> AXError {
let pid:pid_t = 0;
var observer: AXObserverRef;
var axErr:AXError = AXObserverCreate(application:pid, callback:windowCreatedCallback, outObserver:&observer);
return axErr;
}
func windowCreatedCallback(observer:AXObserverRef, element:AXUIElementRef, notificationName:CFStringRef, refcon:void*) -> Void {
println("windowCreatedCallback");
}
上面的Swift代码的初始错误是在windowCreatedCallback,并说“预期”,“分隔符”。我知道这个错误是由于void *不是Swift中的类型。
我尝试将void *更改为:voidPtr,UnsafePointer< AnyObject>,UnsafeMutablePointer< Void>和AnyObject。这些都不能纠正错误。当我使用除void *之外的任何内容时,错误将移至AXObserverCreate调用,因为“无法将表达式的类型转换为AXError类型”。
所以,虽然我意识到我不能使用void *,但回调的声明只在Obj-C中使用,它使用void *。看起来很奇怪AXObserverCallback没有Swift声明,而AXObserverCreate却没有。
我已经研究过这个问题并且无法解决问题。我理解我试图使用的Swift回调没有声明,但是当我尝试使用Obj-C声明格式时,这不起作用,因为AXObserverCreate没有看到回调函数。
非常感谢任何帮助!
答案 0 :(得分:1)
似乎闭包工作(使用Swift 2.2测试):
let axErr = AXObserverCreate(pid, { (observer: AXObserver, element: AXUIElement, notificationName: CFString, refcon: UnsafeMutablePointer<Void>) -> Void in
print(notificationName)
}, &observer)
答案 1 :(得分:0)
对于将来遇到这种情况的人,我需要更改一些内容以与Swift 5配合使用。
var observer: AXObserver?
let axErr = AXObserverCreate(pid, { (observer: AXObserver, element: AXUIElement, notificationName: CFString, refcon: UnsafeMutableRawPointer?) -> Void in print(notificationName) }, &observer)