0

PerfectLib の更新バージョンを参照するときに、PerfectServer モジュール (MCPushServer と呼ばれる) を Ubuntu でコンパイルする際に問題が発生しています。前の質問と同様に、JSON 本文データにアクセスするために、WebRequest の遅延変数パラメーター postBodyString を利用するように PerfectLib を更新しました。これはすべて Mac では正常に動作しますが、新しいファイルを Linux VM にコピーしてプロジェクトを再コンパイルすると、MCPushServer の RegistrationHandler は WebRequest のパラメーターを認識しないため、コンパイルに失敗します。

コンパイラからの出力:

  • MCPushServer/MCUnregistrationHandler.swift:33:28: error: value of type 'WebRequest' has no member 'postBodyString' let bodyData = request.postBodyString

以下の詳細な手順:

  • PerfectLib をリモート サーバーにコピーしました
  • 既存の PerfectLib.so を削除します
  • run 'make': PerfectLib.so が再作成され、'postBodyString への参照が含まれています (ファイルを grep すると、一致が返されました)
  • 'sudo make install' を実行して /user/local/lib/ にリンクします > すべて問題ありません
  • 再コンパイルされた PerfectServer
  • Examples/MCPushServer に cd して make を実行すると、上記のエラーが発生します。

また、WebRequest の既存のメソッド (例: lazy var params) をコメントアウトして、プロセスを繰り返しました。WebRequest のメンバーが見つからないことについて Handler が文句を言うことを期待していましたが、何も起こらなかったかのように対処しているようです。

私のモジュールが構築しようとしているときに参照する PerfectLib / WebRequest の廃止された生成されたインターフェースがどこかにあるかのように見えます。ここで正しい方向に私を向けることができる人はいますか?

4

1 に答える 1

0

他の誰かが XCode で開発したコードを Linux に移植するのに役立つかもしれない場合に備えて、私自身の質問に長い回答を投稿します。

上記のメンバーを参照するときにモジュールがコンパイルされないという私の仮定は、ある種のキャッシュされた生成されたインターフェイスが原因で完全に間違っていました。

問題は、(進行中の) Swift Foundation ライブラリが含まれていない Ubuntu 用の Swift 2.2 公式リリースを使用することにありました。OS X で開発する場合、これは問題ではありません。最新の XCode には基本的な Swift Foundation ライブラリが同梱されており、いずれにせよ、Objective-C Foundation ライブラリで定義されている型をコンパイルするからです。

現在の Swift 3.0 ディストリビューションとコンパイラをインストールすると、問題が解決しました。

私の推測では、postBodyString の実装は、Objective-C または Swift Foundation ライブラリのいずれかを必要とする Foundation API を参照していると思われます。問題のあるメソッドのインターフェイスを公開しないのではなく、そもそも WebRequest がコンパイルされないことを期待していましたが、それは謎であり、この問題についてより専門的な知識を持っている人に任せます。

同様に、「JSONDictionaryType」で添え字を使用するとエラーが発生した理由も説明されています。

> タイプ 'JSONDictionaryType' には添字メンバーがありません

JSONDictionaryType は Dictionary に型エイリアス化されていますが、サブスクリプトの前提条件である「SequenceType」に準拠させることで基本型を拡張する Foundation ライブラリが欠落していました。

于 2016-01-29T15:56:56.477 に答える