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沒有看到回調函數,所以不起作用。
任何援助將不勝感激!
我接受晚了一點,但使用封閉** **是正確的解決方案 – rgbworld 2017-06-21 19:50:12