将 swift 可变参数公开给 Objective-C

2023-11-21

我目前正在开发一个快速动态框架,它将用于 Objective-C 应用程序。

我创建了这个方法(签名):

public init(buttons: ActionButton...) {
///code
}

然而,这个方法永远无法从使用该框架的 Objective-C 应用程序访问(可见)。添加时

@objc

在方法声明前面 xcode 给出错误

“方法不能标记为@objc,因为它有一个可变参数”

因此,如果我理解正确,则 swift 可变参数不能暴露给 Objective C。因此我要问的问题是: 有没有其他方法(CVArgList?)来获得相同的功能?

我知道我可以使用数组,但我不想使用这个函数。

Thanks.


您可以将 C 中的可变参数函数桥接到 Swift,但不能桥接另一个方向。看将 Swift 与 Cocoa 和 Objective-C 结合使用:与 C API 交互:可变参数函数了解更多相关信息。

但这并不难手动实现。只需创建该方法的数组版本并将所有可变参数形式传递给它即可。首先是斯威夫特:

public class Test: NSObject {
    convenience public init(buttons: String...) {
        self.init(buttonArray: buttons)
    }

    public init(buttonArray: [String]) {

    }
}

然后通过类别暴露给ObjC。

@interface Test (ObjC)
- (instancetype) initWithButtons:(NSString *)button, ...;
@end

@implementation Test (ObjC)

- (instancetype) initWithButtons:(NSString *)button, ... {
    NSMutableArray<NSString *> *buttons = [NSMutableArray arrayWithObject:button];
    va_list args;
    va_start(args, button);

    NSString *arg = nil;
    while ((arg = va_arg(args, NSString *))) {
        [buttons addObject:arg];
    }

    va_end(args);
    return [self initWithButtonArray:buttons];
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 swift 可变参数公开给 Objective-C 的相关文章

随机推荐

  • 使用 gson dateformat 序列化和反序列化 unix-timestamps

    我正在使用 Gson 来序列化 反序列化我的 pojo 目前正在寻找一种干净的方法来告诉 Gson 将日期属性解析 输出为 unix 时间戳 这是我的尝试 Gson gson new GsonBuilder setDateFormat U
  • babel 7 不允许在装饰器和类之间使用 export 关键字。请改用“export @dec class”

    我正在使用 React js 和最新的 babel 7 当我使用 mobx 装饰器时出现错误 解析错误 不允许在装饰器和类之间使用导出关键字 请用export dec class反而 my code import React Compone
  • 向从架构生成的 JAXB 类添加额外的方法

    这是我的 XSD 文件的一小段摘录
  • Spark 结构化流的内存问题

    我在 Spark 2 2 0 中运行具有聚合和分区的结构化流时遇到内存问题 session readStream schema inputSchema option OPTION KEY DELIMITER OPTION VALUE DEL
  • 创建一个“机器人”来填写表单中的一些页面

    我想实现一个可以自动填写表格的 机器人 例如 当您可以在页面上填充数据时 是否有解决方案 form1 html并提交 等待下一页并提交数据form2 html 等等 最后 它还应该 单击 按钮来获取表单创建的文件 我希望这个 机器人 会使用
  • 在 Matlab 中将 unicode 字符串写入文件

    我有一个包含乌尔都语字符的字符串 例如 巴扎 这是一个 1x4 数组 我想将其保存到一个文件中 以便外部查看 虽然该字符串不会显示在主命令行窗口中 但变量 str 确实保存了它 当我使用 fprintf fid str 保存该文件并在记事本
  • MediaPlayer 停止播放声音 - Android

    这是一个简单的钢琴应用程序 它可以工作 但有一个问题 在大约 20 次点击后 有时恰好是 28 次点击 即使我点击按钮 它也不会发出任何声音 该应用程序不会崩溃 也不会警告我任何事情 这只是一无所有 没有声音 你有什么主意吗 package
  • Boto3 仅获取特定区域的 S3 存储桶

    以下代码遗憾地列出了所有区域的所有存储桶 而不仅仅是指定的 eu west 1 我怎样才能改变这一点 import boto3 s3 boto3 client s3 region name eu west 1 for bucket in s
  • 自己颁发 JWT 令牌与使用 IdentityServer4(OIDC) 进行 Web API

    https identityserver4 readthedocs io en release intro support html 我目前在我的 Web api 中自己发行令牌JwtSecurityToken我使用标准 ASP NET C
  • 如何从 DataView 的列中获取值?

    我有一个数据视图定义为 DataView dvPricing historicalPricing GetAuctionData DefaultView 这是我尝试过的 但它返回名称 而不是列中的值 dvPricing ToTable Col
  • SQLAlchemy 可以自动从数据库模式创建关系吗?

    从带有外键的现有 SQLite 数据库开始 SQLAlchemy 可以自动构建关系 SQLAlchemy 类是通过自动创建的 table args autoload True 目标是轻松访问相关表中的数据 而无需手动一一添加所有关系 即不使
  • 为什么此代码会导致 Excel 无法正常关闭?

    为什么这行代码会导致Excel无法退出 Excel Range range Excel Range ws Cells 1 1 如果是因为转换的原因 那么这段代码不会导致同样的问题吗 Excel Worksheet ws Excel Work
  • 使用 LINQ 的多个或单个存储库

    我一直在阅读 Professional ASP NET MVC 1 0 书中的第 11 章 可测试设计模式 在本章的示例中 数据访问被分为多个存储库 IOrderRepository IProductRepository 等 这一切都有意义
  • 谷歌地理编码停止为乌克兰克里米亚工作

    我发现了一个非常奇怪的问题 地理编码 API 突然停止支持克里米亚坐标 示例 辛菲罗波尔市 但它适用于乌克兰和俄罗斯的任何其他地方 示例 乌克兰基辅 最近API运行正常 请教一下 是不是因为乌克兰的政治事件而对谷歌进行了限制 该服务是否应该
  • 如何在 Vue Router v4 中为自定义元字段声明 TypeScript 类型接口?

    With Vue 路由器版本 4 目前是在 vue router next repo 的 beta 11 中 有一个文档页 about 如何使用 TypeScript 定义元字段自定义类型接口 declare module vue rout
  • 如何比较 C 中的多字节字符

    我尝试解析文本并在其中找到一些字符 我使用下面的代码 它适用于普通字符 例如abcdef但它不适用于 GCC 给出编译警告 我应该做什么来工作 Code include
  • HTTP 与 Websockets 的开销对比

    我正在两端使用 node js 构建一个文件同步程序 与 Dropbox 不同 我需要有潜在的数千个客户端同时请求数据 这是我当前的系统 服务器通过 websocket 向客户端推送通知 文件已更新 客户端对下载进行排队并在空闲时发出 HT
  • 回形针和 xhr.sendAsBinary

    我使用回形针将文件添加到我的模型中 我想使用firefox 3 6的新功能 xhr sendAsBinary 通过 ajax 请求发送文件 以下是我如何构建我的请求 var xhr new XMLHttpRequest xhr open P
  • JWT 中的复杂声明

    The JWT RFC包含复杂数组似乎没有任何问题 例如 email email protected businesses businessId 1 businessName One roles admin accountant busin
  • 将 swift 可变参数公开给 Objective-C

    我目前正在开发一个快速动态框架 它将用于 Objective C 应用程序 我创建了这个方法 签名 public init buttons ActionButton code 然而 这个方法永远无法从使用该框架的 Objective C 应