Obj-C AXObserverCallback可以转换为Swift吗?

时间:2015-02-09 00:54:18

标签: objective-c xcode swift

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没有看到回调函数。

非常感谢任何帮助!

2 个答案:

答案 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)