【问题标题】:Swift C interop: Passing Swift Argv to C argvSwift C 互操作:将 Swift Argv 传递给 C argv
【发布时间】:2020-08-05 20:56:53
【问题描述】:

我正在为 C 库开发一个快速包装器。这个库中的一个这样的函数需要命令行参数,形式为char const *const *。这链接到 swift 为Optional<UnsafePointer<UnsafePointer<Int8>?>> 从 swift 我可以获得CommandLine.unsafeArgv 的命令行参数,类型为UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>。如何将其转换为预期的不可变类型?我知道 UnsafePointer 有一个采用 UnsafeMutablePointer 的构造函数,但我不确定如何处理嵌套类型。关于如何正确转换的建议?

【问题讨论】:

    标签: swift


    【解决方案1】:

    尝试以下(使用 Xcode 12 / swift 5.3 测试)

        let values: UnsafePointer<UnsafePointer<Int8>?> = 
            UnsafeRawPointer(CommandLine.unsafeArgv).bindMemory(
                to: UnsafePointer<Int8>?.self,
                capacity: Int(CommandLine.argc)
            )
    
        your_api_func(Int(CommandLine.argc), values)
    

    替代方案:(在 @MartinR 评论上)经过测试并运行良好。

        CommandLine.unsafeArgv.withMemoryRebound(
                to: UnsafePointer<Int8>?.self, 
                capacity: Int(CommandLine.argc)) { ptr in
            your_api_func(Int(CommandLine.argc), ptr)
        }
    

    【讨论】:

    • 如果您使用 CommandLine.unsafeArgv.withMemoryRebound(...),您可以稍微简化一下(并去掉 UnsafeRawPointer )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2017-02-15
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2011-07-08
    • 2011-04-28
    相关资源
    最近更新 更多