2017-03-11 5 views
0

Ich habe zwei Funktionen, die fast identisch sind, und ich möchte sie zu einer zusammenführen, aber ich kann nicht herausfinden, wie die Casting-Typ in meiner if-let-Anweisung zu behandeln. Es gibt nur zwei Lösungen, an die ich denken kann, aber ich kann keine von beiden ausführen.Verwenden einer Variablen zum Schreiben in Swift 3

Hier sind die beiden Funktionen (es ihnen viel mehr ist, aber das ist der einzige Teil, den ich Schwierigkeiten in der Zusammenführung verursacht):

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 

     } 
    } 

Mein erster Versuch, einen generischen Parameter machen sollte, die könnten akzeptiere entweder den EventViewController ODER den FinalViewController, aber soweit ich das beurteilen kann, gibt es kein logisches ODER für generische Parameter, nur logisches UND.

Mein zweiter Versuch war eine Computervariable zu erstellen, aber das hat auch nicht funktioniert.

Wie kann ich ein Argument in meinem Funktionsaufruf nehmen, das ich als Klassenart in meinen if-let Block umwandeln könnte?

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

Ich habe dieses Problem in einer sehr klobig Weise gelöst durch eine in-else-Anweisung, aber ich möchte einen eleganteren Weg zur Lösung dieses Problems zu finden.

Antwort

0

Sie können es auf diese Weise

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 
} 

Dann es so nennen:

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

Wenn Sie verwenden vermeiden wollen, wenn Anweisungen, die Sie eine switch-Anweisung stattdessen verwenden können, etwa so:

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

Danke BJHStudios! –

0

Dies ist kein Problem des Gießens .. in Ihrer Anwendung haben Sie zwei Möglichkeiten, bewegen Sie sich zu einem VC oder der ot ihr. Es könnte eine Menge Logik geben, die diese Entscheidung trifft oder nicht. Wie auch immer, irgendwann muss eine Entscheidung darüber getroffen werden, was VC zu zeigen hat. Sie müssen nur über den besten Ort entscheiden, um diese Entscheidung zu treffen.

auf, was Sie bisher gezeigt haben, könnten Sie einfach tun:

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

Ich nehme aber, dass jede Strecke eine andere Aktionen hat, die unterschiedlich behandelt werden müssen. Der gebräuchlichste Ansatz ist hier die Verwendung eines Segments, dann können Sie prepareForSegue verwenden, um das Segment zu erfassen und Eigenschaften basierend auf dem Segmentbezeichner entsprechend festzulegen. Wenn Sie mehr Informationen zur Verfügung stellen können, kann ich eine bessere Antwort geben.

Die Hauptsache, die Sie hier berücksichtigen müssen, ist .. was eigentlich zwischen den beiden unterscheidet. bestimmen diese und Sie können Ihren Code Refactoring Wiederholung

+0

Danke! Ich versuche ständig, meinen Code umzuformen und elegante Lösungen zu finden, um ein besserer Programmierer zu werden, aber ich denke, die if-else-Anweisung war unvermeidlich. –

+0

yeah, das ist, warum ich betonte, die Entscheidung muss irgendwo gemacht werden :) viel Glück mit dem Projekt – Scriptable

+0

Danke :) Ich schätze es –

0

reduzieren Sie können es tun, wie diese

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

Danke!Diese Lösung ist ziemlich nah an dem, was ich entwickelt habe (um nicht zu sagen, dass Ihre Lösung klobig ist) –

Verwandte Themen