2017-03-11 2 views
0

私はほぼ同じ2つの関数を持っていますが、それらを1つにマージしたいのですが、if-letステートメントで型キャストを処理する方法を見つけることができません。私が考えることができるソリューションは2つしかありませんが、どちらも実行できません。ここで 変数を使ってSwiftにキャストを入力する3

は(彼らに多くのがありますが、これは、マージで私のトラブルを引き起こしている部分のみである)二つの関数です:

func loadNextEventViewController() { 
     if let nextEventViewController = storyboard?.instantiateViewController(withIdentifier: "EventViewController") as? EventViewController { 

      // Executed code in here 

     } 
    } 

    func loadFinishViewController() { 
     if let finishViewController = storyboard?.instantiateViewController(withIdentifier: "FinishViewController") as? FinishViewController { 

      // Executed code in here 

     } 
    } 

私の最初の試みは可能性が一般的なパラメータを作ることでしたEventViewControllerまたはFinalViewControllerのいずれかを受け入れることができますが、私が知る限り、論理的なANDのみの汎用的なパラメータの論理ORはありません。

私の2番目の試みはコンピュータ変数を作成することでしたが、これはどちらもうまくいかなかった。

if-letブロックのいずれかのクラス型にキャストできるように、関数呼び出しでどのように引数を取ることができますか?

例: func loadViewController(identifier: String, viewControllerType: UIViewController)

私は中-elseステートメントを使用して非常に不格好な方法でこの問題を解決してきましたが、私はこの問題を解決するためのよりエレガントな方法を見つけるしたいと思います。あなたがあなたの代わりにswitchステートメントを使用することができますif文ので、同じように、使用しないようにしたい場合は

let eventVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("EventViewController") 
    load(eventVC) 

答えて

0

あなたはそれをこのように、このような

func load(_ viewController: UIViewController) { 
    if viewController is EventViewController { 
     //do stuff 
    } 

    if viewController is FinishViewController { 
     //do stuff 
    } 

    //do stuff that applies to all types of view controllers 
} 
その後

それを呼び出すを行うことができます

func load(_ viewController: UIViewController) { 
    switch viewController { 
    case is EventViewController: 
      //do stuff for EventViewController 
    case is FinishViewController: 
      //do stuff for FinishViewControllers 
    default: 
      //do stuff for other types, or break 
    } 
    //do stuff that applies to all viewControllers 
} 
+0

ようにそれを行うことができますあなたのBJHStudiosをありがとう! –

0

これはキャストの問題ではありません。アプリケーションには2つのオプションがあり、1つのvcまたはotに移動します彼女。この決定を下すかどうかを決定するロジックがたくさんある可能性があります。いずれにしても、どのようなVCを表示するか決定する必要があります。あなたはこの決定を下す最良の場所を決定するだけです。

は、あなたがこれまでに示したものに基づいて、あなただけ行うことができます:

func showController(identifier: String) { 
    if let vc = storyboard?.instantiateViewController(withIdentifier: identifier) as? UIViewController { 
      // Executed code in here 
     } 
} 

私は、各ルートが違った取り扱いが必要なさまざまなアクションを持っていること、しかし推測します。最も一般的なアプローチはsegueを使用することです。次に、prepareForSegueを使用してsegueを取得し、segue識別子に基づいて必要に応じてプロパティを設定します。あなたがより多くの情報を提供できるなら、私はより良い答えを提供することができます。

あなたがここで考慮する必要がある主なものは、実際には2つの間で何が違うのですか。これを決定し、あなたが繰り返し

+0

ありがとう!私は常に私のコードをリファクタリングし、より良いプログラマになるためのエレガントなソリューションを見つけようとしていますが、if-elseステートメントは避けられないと思います。 –

+0

ええ、なぜ私は決定がどこかに作られなければならないことを強調した:プロジェクトと幸運 – Scriptable

+0

ありがとう:)私はそれを感謝 –

0

を減らすために、あなたのコードをリファクタリングすることができますあなたはこの

func loadViewController(identifier: String) { 
     let vc = storyboard?.instantiateViewController(withIdentifier: identifier) as? ViewController 
     if let eventVC = vc as? EventViewController { 
      // Executed code in here 
     } else if let finishVC = vc as? FinishViewController { 
      // Executed code in here 
     } 
} 
+0

ありがとう!このソリューションは、私が思いついたものに非常に近いものです(あなたのソリューションが厄介であることを暗示しないように) –

関連する問題