在 Swift 中使用带有 UnsafeMutableRawPointer 或 UnsafeMutablePointer 参数的 ObjC 函数?

Posted

技术标签:

【中文标题】在 Swift 中使用带有 UnsafeMutableRawPointer 或 UnsafeMutablePointer 参数的 ObjC 函数?【英文标题】:Working with ObjC Functions with UnsafeMutableRawPointer or UnsafeMutablePointer Parameter from Swift? 【发布时间】:2016-11-24 07:22:48 【问题描述】:

我是 swift 新手,我正在尝试使用具有参数类型 UnsafeMutablePointer 的 ObjC 函数。我阅读了很多关于使用 UnsafeMutablePointer 或 UnsafeMutableRawPointer 的帖子,但我仍然无法让它工作。功能是: func AXUIElementCopyAttributeNames(_ element: AXUIElement, _ names: UnsafeMutablePointer) -> AXError 我什至找到了确切功能的问题,但答案似乎在 swift 3 中不再起作用。以下是我尝试过的一些不起作用的事情。

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 函数?看来swift中还缺少很多api。 非常感谢!

【问题讨论】:

我已经为 Swift 3 更新了***.com/questions/25124002/…,这有帮助吗? @Martin R - 这完全有效!如果您将其发布为答案,我可以接受。非常感谢! @Martin R - 你可能也知道这个问题的答案。你介意看看吗?这与此有关:使用 ObjC 函数从 CFTypeRef 获取 Swift String...***.com/questions/40784738 【参考方案1】:

AXUIElementCopyAttributeNames 没有指向 unmanaged CFArray 了:

let element: AXUIElement = ...

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

【讨论】:

以上是关于在 Swift 中使用带有 UnsafeMutableRawPointer 或 UnsafeMutablePointer 参数的 ObjC 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用带有completionHandler的UIImageView load()函数

如何在 Swift 3 中使用带有代理的 URLSession

如何在 Swift 中使用带有 Result 的平面图

使用 swift 在 Alamofire 中发送带有对象数组的 JSON 作为参数

如何在 Swift 中使用带有滚动视图的自动布局?

如何在带有 SwiftPM 的 Objective-C 模块中使用 Swift 模块?