2016-11-24 46 views
0

我是新來的swift,我試圖使用具有參數類型UnsafeMutablePointer的ObjC函數。我閱讀了很多關於使用UnsafeMutablePointer或UnsafeMutableRawPointer的文章,但是我仍然無法使它工作。函數是:
func AXUIElementCopyAttributeNames(_ element:AXUIElement,_ names:UnsafeMutablePointer) - > AXError
我甚至發現確切函數的問題,但答案似乎在swift 3中不再有效。下面是一些我試過的東西沒有用。使用帶有UnsafeMutableRawPointer或UnsafeMutablePointer的ObjC函數Swift中的參數?

var ptr : Unmanaged<CFArray>? = nil 
AXUIElementCopyAttributeNames(element, &ptr) 

var names:CFArray? = nil 
        AXUIElementCopyAttributeNames(element, UnsafeMutablePointer(names)) 

var names:CFArray? = nil 
AXUIElementCopyAttributeNames(element, UnsafeMutablePointer<CFArray>(Unmanaged.passUnretained(names).toOpaque())) 

另外,有沒有一個很好的教程,可以讓我很好地掌握在Swift 3中使用ObjC函數?看起來還有很多apis在迅速失蹤。
非常感謝!

+0

我已經更新http://stackoverflow.com/questions/25124002/how-to-handle-unsafepointerunmanagedcfarray的斯威夫特3 ,這有幫助嗎? –

+0

@Martin R - 完全工作!如果你把它作爲答案發布,我可以接受它。非常感謝! – jl303

+0

@Martin R - 你也許也知道這個答案。你介意看嗎?這與此相關:從CFTypeRef獲取Swift字符串與ObjC函數... http://stackoverflow.com/questions/40784738/ – jl303

回答

0

AXUIElementCopyAttributeNames並不需要一個指針 的非託管CFArray了:

let element: AXUIElement = ... 

var cfArray: CFArray? 
let error = AXUIElementCopyAttributeNames(element, &cfArray) 
if error == .success, let names = cfArray as? [String] { 
    // names is [String] array ... 
}