将 Swift 闭包转换为 CFunctionPointer?

Posted

技术标签:

【中文标题】将 Swift 闭包转换为 CFunctionPointer?【英文标题】:Convert Swift closure to CFunctionPointer? 【发布时间】:2015-01-26 09:40:23 【问题描述】:

是否可以将 Swift 程序中的闭包传递到相应参数已标记为 CFunctionPointer 的 API 中?

我遇到了一些迹象(例如 here),这在 Xcode 6 的(现在已经过时的)beta 版本中是不可能的。

但是,您不能调用 C 函数指针或将闭包转换为 C 函数指针类型。

现在有可能吗?如果可以,怎么做?

例如,如何在 Swift 中定义一个在调用 AudioservicesAddSystemSoundCompletion 时会被接受为 AudioServicesSystemSoundCompletionProc 的闭包?

This answer 使用 Swift 和 Objective-C 来达成解决方案。是否可以单独使用 Swift 类?

【问题讨论】:

Objective-C Wrapper for CFunctionPointer to a Swift Closure的可能重复 【参考方案1】:

不,仅使用 Swift 尚无法实现。

但是,您不能调用 C 函数指针或将闭包转换为 C 函数指针类型。

仍然有效并且是最新的。没有办法在 Swift 中定义闭包或将闭包转换为 C 函数。您只能引用已定义的 C 函数。

【讨论】:

您能否引用当前的 Apple 文档来支持这一点。 (那我就接受答案了。) 基本上However, you cannot call a C function pointer or convert a closure to C function pointer type.仍然有效。

以上是关于将 Swift 闭包转换为 CFunctionPointer?的主要内容,如果未能解决你的问题,请参考以下文章

将objective-c块转换为Swift闭包

如何在 Swift 中将计算的闭包属性转换为闭包?

Swift 中的可选闭包属性

简写的闭包数组:Xcode Swift:表达式太复杂,无法在合理的时间内解决

Swift 闭包 与 OC block区别

swift中的闭包总结