2017-12-15 20 views
-1

私のプロジェクトでは3つの異なる環境を設定しました。私は、スキームに設定された設定に基づいてベースURLを逃しようとしています。私は、私がアクセスできるよ、これは行うことができます知っているどのように私は#if疑似命令内で定義された構造体変数にアクセスできません

のようなコードの下から「BASE_URL」という名前の変数にアクセスすることができますAppConstants.API.BASE_URL

class AppConstants 
{ 
    struct API 
    { 
     #if ENV_DEV 
     static let BASE_URL = "http://api_dev .../" 
     #endif 

     #if ENV_STAGE 
     static let BASE_URL = "http://api_stag .../" 
     #endif 

     #if ENV_PROD 
     static let BASE_URL = "https://api_prod .../" 
     #endif 
    } 
} 

UPDATE:

他のプロジェクトでは、この方法のように

enter image description here

enter image description here

UPDATE 2:他のプロジェクトから0

  • 私が設定した環境では、として、アクティブcomilation条件にvarsのenter image description here

    私は何かが不足していると思う、ビルドの設定にある可能性があります。

+0

なぜこれはクラスにする必要がありますか? –

+1

アクセス方法とエラーメッセージは何ですか? –

+1

それはコンパイルされますか?コンパイラの観点からのあなたの 'BASE_URL'宣言は、互いに排他的ではありません。開発者の注意を借りずに、3つの '#if'チェックのうちの2つまたは3つ全てをパスし、複数回宣言している' BASE_URL'を防ぎます。 – user28434

答えて

1

次のコードをテストしただけで動作するはずです。基本的には、すべて#ifから#elseif#elseを使用するように変換する必要があります。これは、いずれのステートメントも当てはまらない場合にBASE_URLが存在しない可能性があるためです。

また、デフォルト値を設定し、ifステートメントごとに変更することもできます。しかし、何らかの理由で、ifステートメントのどれも当てはまらない場合は、変数の値を定義する必要があります。

class AppConstants 
{ 
    struct API 
    { 
     #if ENV_DEV 
     static let BASE_URL = "http://api_dev .../" 
     #elseif ENV_STAGE 
     static let BASE_URL = "http://api_stag .../" 
     #else 
     static let BASE_URL = "https://api_prod .../" 
     #endif 
    } 
} 

print(AppConstants.API.BASE_URL) 

if文が真でない場合、この解決策はデフォルトの最後のベースURLになることに注意してください。元の質問にはデフォルトはありませんでした。この動作が許容されるかどうかは、構成によって異なります。フラグのいずれかを設定しない場合、あなたはエラーになります、ここで

class AppConstants 
{ 
    struct API 
    { 
     static let BASE_URL: URL = {() -> URL in // URL should be URL 
      let baseURLString: String 

      #if ENV_DEV 
       baseURLString = "http://api_dev .../" 
      #endif 

      #if ENV_STAGE 
       baseURLString = "http://api_stag .../" 
      #endif 

      #if ENV_PROD 
       baseURLString = "https://api_prod .../" 
      #endif 

      return URL(string: baseURLString)! // If no proper flag is set, you will get error here 
     }() 
    } 
} 

:あなたがそのようなものを使用することができ、適切なコンパイルフラグを設定していないから身を守るために

+0

ありがとうございます。これは完璧です。しかし、更新された質問のスクリーンショットに表示されているような、なぜonlt #ifでアクセスできないのでしょうか? – iAkki

+1

最初のアップデートのスクリーンショットがなぜうまくいかなかったのですか?私はあなたが安全でデフォルト値を設定すべきだと思います。ユーザー28434は、開発者の注意を除いて何度も宣言されていることを防ぐ手段は何もないと述べています。これは通常、悪いことであり、問​​題の扉を開きます。コードは防衛的です。ここでデフォルト値でelse文を使用し、BASE_URLが常に宣言されることを保証するのが最良の方法です。 –

+0

私はこの解決策に同意しません。すべてのコンフィグレーションに専用のベースURLが必要な場合、ビルド設定の定義が欠落している*プログラミングエラー*であり、静かに* some * URLに落ちるのではなく、コンパイルするべきではありません。 - OPのコードがコンパイルされない理由についても説明していません。 –

0

元のコードのように複数のフラグを設定するとエラーが発生し続けます。

関連する問題