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

用于快速关闭的CFunctionPointer的Objective-C包装器

袁雅逸
2023-03-14
问题内容

我正在使用Swift,并且注意到Swift不允许创建CFFunctionPointers。它只能绕过并引用现有的。

例如,CoreAudio需要对某些回调使用CFunctionPointer,因此我不能使用纯Swift。

所以我需要在这里使用一些Objective-
C蹦床或包装器,将Swift闭包作为参数以及原始的回调原型,然后可以将其分配为回调,但是实际动作发生在Swift中,而不是Objective-C 。

我该怎么做呢?

此类包装程序的一些示例代码将帮助我理解如何以灵活的方式使用目标C中的Swift代码来实现此类目的,以解决无法创建CFunctionPointers的问题。

是的,我知道我可以随时在Objective-
C中写东西。我想在纯粹的Swift中做为学习练习,将我的一个应用程序移植到Swift(使用了大量的CoreAudio / CoreVideo框架)。


问题答案:

我需要定义此回调:

typedef void (*MIDIReadProc) ( const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon );

我想尽可能地使用Objective-C。

这是我的方法:

MIDIReadProcCallback.h

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>

typedef void (^OnCallback)(const MIDIPacketList *packetList);

@interface MIDIReadProcCallback : NSObject

+ (void (*)(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon))midiReadProc;
+ (void)setOnCallback:(OnCallback)onCallback;

@end

MIDIReadProcCallback.m

#import "MIDIReadProcCallback.h"

static OnCallback _onCallback = nil;

static void readProcCallback(const MIDIPacketList *pktlist, void *refCon, void *connRefCon) {
    if (_onCallback) {
        _onCallback(pktlist);
    }
}

@implementation MIDIReadProcCallback

+ (void (*)(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon))midiReadProc {
    return readProcCallback;
}

+ (void)setOnCallback:(OnCallback)onCallback {
    _onCallback = onCallback;
}

@end

然后您可以注册MIDIReadProcCallback.midiReadProc为回调并设置处理程序MIDIReadProcCallback.setOnCallback({ (packetList: MIDIPacketList) in ... })



 类似资料:
  • 主要内容:1. Objective-C集合快速枚举是Objective-C的功能,用于枚举集合。 因此,要了解快速枚举,首先需要了解集合,这将在下一节中进行说明。 1. Objective-C集合 集合是基本结构。它用于保存和管理其他对象。 集合的主要目的是提供一种有效存储和检索对象的通用方法。 有几种不同类型的集合。 虽然它们都能实现能够容纳其他对象的相同目的,但它们的主要区别在于检索对象的方式。 Objective-C中使用的最常见的

  • 问题内容: 我正在对服务器进行API调用。我正在利用Alamofire来解决这个问题。我正在尝试创建一个使用Alamofire的GET函数返回基于自定义类的对象的函数,该类包含此GET函数提供的各种输出。 我不清楚执行此操作的方式。 这是我的自定义类,其中包含有关响应的详细信息: 在另一个类中,我具有以下功能: 这将返回,因为在执行之前对服务器的调用未完成。我知道我应该能够使用闭包来做到这一点,但

  • 问题内容: 我正在使用wahoo Fitness API,它定义了以下Objective-C枚举: 我找不到快速使用它的方法。我首先尝试对其进行切换/操作,但未成功。我正要继续进行以下操作: 但是它不能编译: 任何解决方法?我阅读使用,但在xcode beta-4中不起作用。 问题答案: 如您所说,从.beta 4开始,使用.value获取基础整数的解决方法不再起作用。 不幸的是an 不能从Obj

  • 问题内容: 我从事ios开发已经有几个月了,渴望在我的编程模式中实现新的东西。 现在,我正在学习闭包,并且对其语法了解甚少,知道可以将其用于代替回调。以及在某些UIViewAnimation中实现和排序。 但是我真的想知道它的用途。也就是说,在基本编程中应该在哪里使用闭包。就像我们要从孩子向父母发送信息时使用委托一样。因此,在日常的快速编程中可以使用的有关其实际的任何解释或简短示例都会有所帮助?

  • 我正在关注一个在线课程(从2016年12月开始),并在此屏幕截图中收到错误。 这是我的代码: // // FirebaseManager.swift 多谢你的帮忙

  • 问题内容: 我在编写以下函数作为闭包时遇到麻烦 我试过了 但这不起作用。 有什么建议? 问题答案: 我相信您要的东西没有任何意义(与Swift无关)。尽管我有兴趣证明自己是错误的,但我不认为可以用任何强类型语言合理地创建它。(编辑:继续我的研究,我相信使用一流的多态性的语言是可行的,但我不知道实际上有此功能的任何通用语言。) 您希望是哪种类型?泛型创建抽象类型。除非专业化,否则它不会成为真实类型。