4

main.swift文件中,我们调用了收据检查系统(由Receigen生成)。在 Swift 2 中,main.swift阅读:

startup(Process.argc, UnsafeMutablePointer<UnsafePointer<Int8>>(Process.unsafeArgv))

升级到 Swift 3 后,我已经做到了:

startup(CommandLine.argc, UnsafeMutablePointer<UnsafePointer<Int8>>(CommandLine.unsafeArgv))

显示错误:

无法将类型 UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>(aka UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) 的值转换为预期的参数类型UnsafeMutablePointer<_>

更新:使用链接的问题,使其内容为:

startup(CommandLine.argc, UnsafeMutableRawPointer(CommandLine.unsafeArgv)
    .bindMemory(
        to: UnsafeMutablePointer<Int8>.self,
        capacity: Int(CommandLine.argc)))

产生:

无法将类型的值转换UnsafeMutablePointer<Int8>.Type为预期的参数类型UnsafePointer<Int8>?.Type(又名 Optional<UnsafePointer<Int8>>.Type

编译器指的是to:UnsafeMutablePointer.

启动的标头如下所示:

int startup(int argc, const char * argv[]);

如何成功地将变量传递给 startup in main.swift

4

1 回答 1

7

基本上,这是这里讨论的问题的一个变体:

Xcode 8 beta 6:main.swift 无法编译

问题是您的类型CommandLine.unsafeArgv与 C 函数预期的类型之间存在阻抗不匹配。而且您不能再仅仅通过从一种可变指针类型强制转换为另一种来消除这种不匹配。相反,您必须通过调用bindMemory. 要求 a 的错误消息Optional<UnsafePointer<Int8>>.Type告诉您要转向哪种类型:

    startup(
        CommandLine.argc,
        UnsafeMutableRawPointer(CommandLine.unsafeArgv)
            .bindMemory(
                to: Optional<UnsafePointer<Int8>>.self,
                capacity: Int(CommandLine.argc))
    )

那应该允许你编译。在我的机器上使用 stub 进行测试startup,它实际上可以运行。但它是否会在你的机器上运行,以及它是否安全,谁也说不准!不可否认,这件事令人抓狂……

编辑iOS 12 / Xcode 10 中修复了这个问题CommandLine.unsafeArgv,所以这个问题可能也被修复了。

于 2016-10-12T18:18:50.310 回答