Objective-C++ 和 Swift - 桥接头中的嵌套结构

Posted

技术标签:

【中文标题】Objective-C++ 和 Swift - 桥接头中的嵌套结构【英文标题】:Objective-C++ and Swift - nested structs in bridging header 【发布时间】:2020-11-22 12:44:29 【问题描述】:

请帮助我解决以下问题。我正在使用 swift 参数解析器库https://github.com/apple/swift-argument-parser

假设我在某个 swift 文件中有这个 swift 代码:

@objc public class Math: NSObject, ParsableCommand 
    static var configuration = CommandConfiguration(
        abstract: "A utility for performing maths.",
        subcommands: [Add.self],
        defaultSubcommand: Add.self)

    
extension Math 
    struct Add: ParsableCommand 
        static var configuration = CommandConfiguration(abstract: "Print the sum of the values.")        
        mutating func run() 
            print("0")
        
    

` 我想调用一个名为“func”的objective-c ++函数,其参数类型为Math.Add,就像main.swift文件中的那样:

var status: Int32 = 0
do 
    // try to parse application arguments
    var args = try Math.parseAsRoot()
    switch args 
        case let args as Math.Add:
            status = func(args)
        default:
            try args.run()
        
 catch 
    //Some code...

函数的签名应该是什么以及桥接头文件应该是什么样子?我的签名是:

extern "C" int func(Math.Add *args);

而我的桥接头是这样的:

#ifndef __BRIDGING_HEADER_H__
#define __BRIDGING_HEADER_H__



@class Math;


#ifdef __cplusplus
   extern "C" 
#endif
   int func(Math.Add  *args);
#ifdef __cplusplus
    
#endif

#endif /* __BRIDGING_HEADER_H__ */

但是它不起作用并且桥接头没有编译(Xcode 写错误:接口类型'Math' 不能按值传递;你忘记了'Math' 中的*?

【问题讨论】:

【参考方案1】:

Objective-C(++) 不支持嵌套类型,如果你想在 Swift 上保留嵌套结构,你可以做的是为 Objective-C 导出一个非嵌套类型:

extension Math 
    @objc(Math_Add) // or MathAdd, or whatever name you like
    struct Add: ParsableCommand 

,然后可以在您的标题中引用:

int func(Math_Add  *args);

作为旁注,我还将 func 函数的名称更改为不与 Swift 关键字冲突的名称。即使您能够调用它,它也会让其他阅读您的代码的人感到困惑。

【讨论】:

以上是关于Objective-C++ 和 Swift - 桥接头中的嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

无法使用桥接头将 Objective-C 文件导入 Swift 项目

我可以使用桥接头在基于 Swift 的项目中导入 Objective-C++ 类吗?

Objective-C Swift 桥接头

Objective-C Swift 桥接头

归档发布时,通过桥接头暴露的 Objective-c 类在 swift 中不可见

从 Objective-C 桥接到 swift 时,swift 编译器如何识别变量是复制的还是强的?