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[]);

変数をスタートアップに渡すにはどうすればよいmain.swiftですか?

4

1 に答える 1

7

基本的に、これはここで説明した問題の変形です。

Xcode 8 ベータ 6: main.swift がコンパイルされない

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実際に実行されます。しかし、それがあなたのマシンで動くかどうか、そしてそれが安全かどうかは誰にもわかりません! このようなものは紛れもなく腹立たしいです...

編集iOS 12 / Xcode 10 で問題CommandLine.unsafeArgvが修正されているため、この問題も修正されている可能性があります。

于 2016-10-12T18:18:50.310 に答える