gpt4 book ai didi

swift - Swift 3 中预期参数类型 UnsafeMutablePointer<_> 的 UnsafeMutablePointer

转载 作者:搜寻专家 更新时间:2023-10-31 08:20:01 26 4
gpt4 key购买 nike

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))

显示错误:

Cannot convert value of type UnsafeMutablePointer<UnsafeMutablePointer<Int8>?> (aka UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) to expected argument type UnsafeMutablePointer<_>

更新:使用 linked question所以它是这样写的:

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

产生:

Cannot convert value of type UnsafeMutablePointer<Int8>.Type to expected argument type UnsafePointer<Int8>?.Type (aka Optional<UnsafePointer<Int8>>.Type)

编译器指的是 to:UnsafeMutablePointer .

启动的 header 如下所示:

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

如何在 main.swift 中成功将变量传递给启动?

最佳答案

基本上,这是此处讨论的问题的变体:

Xcode 8 beta 6: main.swift won't compile

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

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

那应该允许你编译。使用 startup 的 stub 在我的机器上进行测试,它实际运行。但它是否会在您的机器上运行,是否安全,是任何人的猜测!这东西无疑是令人抓狂的......

编辑 CommandLine.unsafeArgv 的问题已在 iOS 12/Xcode 10 中修复,因此可能此问题也已修复。

关于swift - Swift 3 中预期参数类型 UnsafeMutablePointer<_> 的 UnsafeMutablePointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40004761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com