2017-02-08 10 views
0

私は単一のコードベースから多数のターゲットを管理する必要があります。それぞれのターゲットについて、私はテーマカラー、ヘッダー名などのプロパティを設定しました。これは、プロトコルとコモンクラスを使用してこれを達成することができます。しかし、それはターゲットクラス型のオブジェクトを作成する必要があります。私は作成オブジェクトを作成したくありません。私はちょうど各ターゲットクラスのために静的に設定されている値を返すプロトコルを拡張したい。swift3の異なるターゲットに共通の意思決定ファイルを設計する

class AbstractClientFactory: AbstractProtocol 
{ 
    func getServerUrl() -> String 
    { 
     return "Default URL" 
    } 
} 
一般的な実装および戻り値を拡張

ターゲットクラスに従ってとして

class InspectClient1: AbstractClientFactory { 
    override func getServerUrl() -> String { 
     return "Target1 url value" 
    } 
} 

ターゲット2デフォルト値を返す

protocol AbstractProtocol { 
    func getServerUrl() -> String 
} 

共通クラス延びるプロトコル:以下

は私のコードでありますクラス

class InspectClient2: AbstractClientFactory { 
    override func getServerUrl() -> String { 
     return "Target 2 url" 
    } 
} 

はViewControllerをで

class AbstractClient 
{ 
    class func createAbstractClient() -> AbstractProtocol 
    { 
     return InspectClient1() 
    } 
} 

コンパイル時にクライアントタイプを返すブリッジクラスを追加しました、私は、ターゲットのオブジェクトを返さずにこれを達成したいターゲットURLに

AbstractClient.createAbstractClient().getServerUrl() 

を取得していますタイプ。 View Controllerでプロトコルを拡張することでオーバーライドメソッドを呼び出す方法は他にありますか? すなわち VC - >プロトコル - >最初のデフォルトの実装ののgetURLを呼び出す - >その後、InspectClient1/InspectClient2がターゲットごとにgetURLメソッドをオーバーライドする呼び出す

は、オブジェクトを返さず、可能ですか?

+0

グローバル変数を代わりに使用し、ウェーハクラスを使用します。あなたの設定はenunでもかまいません。 – Sulthan

+0

@ Suulthan - もし私がグローバル変数やenumを追加したら、もしそれらの変数を正しく使用しなければならないのでしょうか?私は望んでいません。別の解決策を提案してもらえますか? –

+0

いいえ、それは私が意味するものではありません。 – Sulthan

答えて

0

このためのプロトコルは必要ありません。異なるターゲットは、同じ名前の異なるクラスを持つことができます。 たとえば、 "Constants"という名前のクラスまたはファイルを作成できます。

class Constants { //target 1 
    let url = "target 1 url" 
} 

class Constants { //target 2 
    let url = "target 2 url" 
} 

次に、ターゲット内の任意のクラスのurlプロパティを呼び出します。

同じ名前の拡張子(ターゲットの各拡張子)を持つプロトコルを作成することもできます。

唯一の欠点は、すべてのターゲットにすべての定数を追加する必要があることです。それ以外の場合は作成されません。一方で、あなたはコンパイル時に欠けているものを見て修正することができます。

0

実行する可能性はたくさんありますが、必要なことは1つあります。実行時に構成を切り替えたいのですか?例えば。デバッグ用?

あなたは、実行時に設定を切り替えたい場合は、単に列挙型を使用することができます。

enum MyTarget { 
    case test 
    case production 

    var url: String { 
     switch self { 
     case .test: 
      return "my test url" 
     case .production: 
      return "my production url" 
    } 
} 

とグローバル変数現在のターゲット保持:

var currentTarget: MyTarget = .test 

は、この変数の意志の値を変更しますどこでも設定を変更してください(おそらく、UIなどを更新するための通知を引き起こす必要があります)。

あなたのURLはcurrentTarget.urlで簡単にアクセスできます。

あなたは、実行時に設定を切り替えるにはしたくない場合は、構造体やクラスにあなたの設定パラメータをラップすることができます:Config.urlするだけで、あなたのURLにアクセス

#if MY_CONFIG_TEST 
class Config { 
    static let url = "my test url" 
} 
#elif MY_CONFIG_PRODUCTION 
class Config { 
    static let url = "my test url" 
} 
#endif 

プロトコルや抽象クラスを必要とせず、シングルトンを必要としません。

関連する問題