2015-02-09 77 views
1

AXObserverCallback可以轉換爲Swift嗎?我遇到的問題似乎與void *有關,我知道它不是Swift中的有效類型。Obj-C AXObserverCallback可以轉換爲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"); 
} 

我試圖轉換爲夫特是:

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"); 
} 

與上述銀行代碼的初始誤差是在windowCreatedCallback和說「預期」,「分隔符」。我知道這個錯誤是由於void *,它不是Swift中的類型。

我曾試圖改變無效*到:voidPtr,UnsafePointer <AnyObject>,UnsafeMutablePointer <太虛>和AnyObject。這些都不能糾正錯誤。當我使用除void *之外的任何內容時,則錯誤將移至AXObserverCreate調用,因爲「無法將表達式的類型轉換爲類型AXError」。所以,雖然我意識到我不能使用void *,但回調的聲明只是在Obj-C中,它使用了void *。看起來很奇怪,沒有AXObserverCallback的Swift聲明,但有AXObserverCreate。

我研究了這個問題並且一直無法解決問題。我明白我嘗試使用的Swift回調函數沒有聲明,但是當我嘗試使用Obj-C聲明格式時,由於AXObserverCreate沒有看到回調函數,所以不起作用。

任何援助將不勝感激!

回答

1

看來,關閉工作(與雨燕2.2測試):

let axErr = AXObserverCreate(pid, { (observer: AXObserver, element: AXUIElement, notificationName: CFString, refcon: UnsafeMutablePointer<Void>) -> Void in 
    print(notificationName) 
}, &observer) 
+0

我接受晚了一點,但使用封閉** **是正確的解決方案 – rgbworld 2017-06-21 19:50:12