当前位置: 首页 > 面试题库 >

使用Swift CFunctionPointer将回调传递给CoreMIDI API

孟承嗣
2023-03-14
问题内容

可能这实际上是当前不可能的,这很不幸。我正在尝试调用CoreMIDI API来设置MIDI输入。这就是我要在Swift中html" target="_blank">执行的操作:

var midiClient = MIDIClientRef()
var inputPort = MIDIEndpointRef()
var status: OSStatus

func readProc(packetList: UnsafePointer<MIDIPacketList>, readProcRefCon: UnsafeMutablePointer<Void>, srcConnRefCon: UnsafeMutablePointer<Void>) -> Void {
}

status = MIDIClientCreate("MIDI client", nil, nil, &midiClient);

status = MIDIDestinationCreate(midiClient, "MIDI input", readProc, nil, &inputPort);

但我收到此错误:“((UnsafePointer,UnsafeMutablePointer,UnsafeMutablePointer)->无效”无法转换为“
MIDIReadProc”

MIDIReadProc的typedef如下:

typealias MIDIReadProc = CFunctionPointer<((UnsafePointer<MIDIPacketList>, UnsafeMutablePointer<Void>, UnsafeMutablePointer<Void>) -> Void)>

有没有一种方法可以让我的readProc方法的函数指针传递给MIDIDestinationCreate API?


问题答案:

在Swift 2.0(作为Xcode 7的一部分)中,处理函数指针的C
API使用带注释的函数类型@convention(c)。您可以将任何Swift函数,方法或闭包作为@convention(c)函数类型进行传递-
但前提是该闭包符合C约定……例如,它无法从其周围的范围捕获状态。

有关详细信息,请参见 The Swift Programming Language Type
Attributes。
__

至于Xcode 6中的功能:Swift
1.x无法将Swift函数或闭包转换为C函数指针-该CFunctionPointer类型的唯一用途是将从(Obj)C
API导入的函数指针传递给其他(Obj)C API。

您可以在C代码中声明一个函数指针,然后通过项目的桥接标头将其公开给Swift,然后使用Swift将其传递给CoreMIDI。但是由于无论如何都要跨过桥梁,所以您可能会想到最好将项目的哪些部分保留在C中,以及从这些部分到Swift代码的最佳接口是什么。



 类似资料:
  • 问题内容: 我试图将回调函数从控制器传递给指令。 这是回调函数代码: 指令用法: 指令代码: 模板中的回调用法: 但是,这给了我以下错误: 我看过很多类似的问题,但不明白我在哪里错了。 问题答案: 从指令中调用表达式方法时,您需要以格式传递指令中的参数,还应更正指令属性值以像 指令用法: 指令模板

  • 问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)

  • 问题内容: 有没有办法将更多数据传递到jQuery中的回调函数中? 我有两个函数,例如,我希望回调到,以传递AJAX调用的结果数据以及一些自定义参数 我希望能够将自己的参数以及AJAX调用返回的结果传递给回调。 问题答案: 解决方案是通过闭包绑定变量。 作为一个更基本的示例,下面是一个示例函数,该函数接收并调用一个回调函数,以及一个示例回调函数: 这将调用回调并提供一个参数。现在,您想提供一个附加

  • 问题内容: 我有一些如下的JavaScript代码: 我收到未定义的错误,在使用该功能之前,一切都在工作。 我希望一段时间后调用我的函数。我该怎么办? 问题答案: setTimeout(function() { postinsql(topicId); }, 4000) 您需要将匿名函数作为参数而不是字符串作为参数,后一种方法甚至不符合ECMAScript规范,但浏览器比较宽松。这是正确的解决方案,

  • 问题内容: 将参数传递到匿名onreadystatechange回调的普通纯JavaScript(即非JQuery)方法是什么? 例如: 问题答案: Javascript支持闭包,因此您编写的匿名函数将能够从封闭范围访问和访问。 如果要显式地执行此操作(例如,如果要在代码中的其他位置定义回调函数并重用它),则可以创建一个函数来创建回调。这也使您可以使用不同的名称(例如和)来对变量进行别名别名: 然

  • 我正在尝试设置一个“事件接收器”类,将GLFW回调封装到用户可以从中继承的类中,但在将基类成员函数传递到GLFW“set callback”函数中时遇到问题。 这本质上提供了一个带有纯虚拟函数的基类,供用户继承和重写,以便在事件发生时提供自己的逻辑。用户定义的子类将被传递到更大的“应用程序框架”类中,该类将进行必要的调用以设置GLFW回调函数。 当然,您不能将成员函数作为函数参数传递,因为您必须提