2016-12-21 4 views
0

Ich hatte diese Frage ziemlich lange. Ich versuche das Problem der 3 Türen zu visualisieren, nur um Spaß zu haben und mit Swift zu üben. So habe ich:Wie kann dieser Code gekürzt werden, um Doppelungen zu vermeiden?

3 Türen und daher 3 verschiedene IBActions & 3 Funktionen für alle Türen. Diese Funktionen sind alle genau gleich, jedoch ist nur die Anzahl der Türen in jedem Code unterschiedlich. Also ich frage mich, kann ich diesen Code kürzen ?:

func openSecondChoice(whatDoorIsClickedOn: Int) 
    { 
     if whatDoorIsClickedOn == 1 
     { 
      if whatDoorIsClickedOn == doorWithNumber 
      { 
       UIButtonDoor1.setBackgroundImage(UIImage (named: "doorWithMoney"), for: UIControlState.normal) 
      } 
      else 
      { 
       UIButtonDoor1.setBackgroundImage(UIImage (named: "doorWithGoat"), for: UIControlState.normal) 
      } 
     } 
     if whatDoorIsClickedOn == 2 
     { 
      if whatDoorIsClickedOn == doorWithNumber 
      { 
       UIButtonDoor2.setBackgroundImage(UIImage (named: "doorWithMoney"), for: UIControlState.normal) 
      } 
      else 
      { 
       UIButtonDoor2.setBackgroundImage(UIImage (named: "doorWithGoat"), for: UIControlState.normal) 
      } 
     } 
     if whatDoorIsClickedOn == 3 
     { 
      if whatDoorIsClickedOn == doorWithNumber 
      { 
       UIButtonDoor3.setBackgroundImage(UIImage (named: "doorWithMoney"), for: UIControlState.normal) 
      } 
      else 
      { 
       UIButtonDoor3.setBackgroundImage(UIImage (named: "doorWithGoat"), for: UIControlState.normal) 
      } 
     } 
    } 

Yuk! Dieser Code ist so hässlich! Wenn der Benutzer zum Beispiel auf door1 drückt, rufe ich die Funktion "openSecondChoise (whatDoorIsClickedOn: 1)" auf. Gibt es eine Möglichkeit, dies zu verkürzen? Vielen Dank! Ich benutze keine Kurse hier, sollte ich sie benutzen?

+2

Sie sollten dies auf http://codereview.stackexchange.com anstatt hier veröffentlichen. – rmaddy

Antwort

5

Normalerweise, wenn Sie beginnen, Ihre Variablennamen mit 1, 2, 3, etc. zu suffixieren, ist es Zeit, stattdessen ein Array zu verwenden. Dafür gibt es Arrays.

Mit einem Array uiButtonDoors das enthält Ihre UIButtonDoor1 ... UIButtonDoor3, Ihre Funktion könnte wie folgt aussehen:

func openSecondChoice(whatDoorIsClickedOn: Int) { 
    let imageName = whatDoorIsClickedOn == doorWithNumber ? "doorWithMoney" : "doorWithGoat" 
    uiButtonDoors[whatDoorIsClickedOn - 1].setBackgroundImage(UIImage(named: imageName), for: UIControlState.normal) 
} 
+0

Dies wird für 'whatDoorIsClickedOn == 3' – Cabus

+0

@Cabus abstürzen Oh richtig, danke. Ich werde es reparieren. – emlai

+0

Nr. Ich denke, Ihre Lösung - obwohl sie kürzer ist als meine - ist etwas unbequemer, weil OP die Struktur ihres Codes außerhalb der Methode selbst ändern müsste ... Ich denke, hier ist es nur eine Frage des Geschmacks. Allerdings stimme ich völlig überein, eine Reihe von Tasten für sauberer Code zu verwenden :) – Cabus

3
func openSecondChoice(whatDoorIsClickedOn: Int) { 
    let imageName = whatDoorIsClickedOn == doorWithNumber ? "doorWithMoney" : "doorWithGoat" 
    let image = UIImage(named: imageName) 

    let button: UIButton 

    switch whatDoorIsClickedOn { 
    case 1: 
    button = UIButtonDoor1 
    case 2: 
    button = UIButtonDoor2 
    case 3: 
    button = UIButtonDoor3 
    default: 
    fatalError("Cannot be. Switch must be exhaustive, that's why we need to use 'default' for a switch on Int.") 
    } 

    button.setBackgroundImage(image, for: .normal) 
} 

für eine kürzere Versionsprüfung @tuple_cat s Antwort.

+0

Ich benutzte ein paar ternäre Bedingungsoperatoren anstelle eines Schalters, aber den gleichen Effekt. @tuple_cat hat eine viel bessere Antwort. –

+1

Oder statt des ganzen Schalters: 'let Schaltfläche = [UIButtonDoor1, UIButtonDoor2, UIButtonDoor3] [whatDoorIsCl ickedOn - 1] ' –

+0

Vielen Dank für Ihre Zeit. Sie sagen jedoch, dass tuple_cat eine bessere Antwort hat, also werde ich darauf schauen. Aber eine Frage für Sie, warum switch-Anweisung über eine if-Anweisung verwenden? Ich habe es gesucht, ich habe diese Antwort: http://stackoverflow.com/questions/1028437/why-switch-case-and-not-if-else-if Ist es noch gültig oder veraltet? – Petravd1994

2

Ein anderer Ansatz, zum Spaß.

import UIKit 

class DoorGame { 
    func setupButtons() { 
     let buttons = [UIButton(), UIButton(), UIButton()] 

     for (index, button) in buttons.enumerated() { 
      button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) 
      button.setTitle("\(index)", for: .normal) 
     } 

     let winningIndex = Int(arc4random_uniform(UInt32(buttons.count))) 

     buttons[winningIndex].tag = 1 
    } 

    @objc func buttonTapped(_ sender: UIButton) { 
     let imageName = sender.tag == 1 ? "doorWithMoney" : "doorWithGoat" 
     let image = UIImage(named: imageName) 

     sender.setBackgroundImage(image, for: .normal) 
    } 
} 
+0

Wow! Dies ist anders als die obigen Antworten. Aber danke für deine Zeit. Ich verstehe das alles nicht, zum Beispiel: Warum eine Klasse hier über eine Funktion benutzen? Warum benutzt du "@objc" vor dem "fun buttonTapped"? Und zuletzt: Was ist "let imageName = sender.tag == 1?"doorWithMoney": "doorWithGoat" "Wie nennst du es? War es das? Ist es eine Bedingung und": "trennt die richtige Antwort von der falschen Antwort, wenn die Bedingung erfüllt ist (Bedingung ist alles vor"? ")? Danke! – Petravd1994

+0

Das Thema dieser Antwort ist, die Eigenschaft 'tag' zu verwenden, um einige Daten auf einer Schaltfläche einzubetten (' tag == 1 'bedeutet, dass es der Gewinner ist), und dann die Ausbesserungsaktion auf der Schaltfläche zu verwenden Ändern Sie das Hintergrundbild. Es ist in einer Klasse, weil Verkapselung ein Markenzeichen für gutes Programmdesign ist. '@ objc' ist ein fortgeschrittenes Thema, also werde ich empfehlen, dass Sie später darüber lesen. Normalerweise wäre dieser Code in einem View-Controller und Sie würden nicht 't brauche '@ objc', ich wollte nur, dass dies in einem Swift-Spielfeld kompiliert wird, weshalb ich es eingeschlossen habe.'?: 'ist der Bedingungsoperator. Es ist eine Kurzschrift' if/else' Aussage. Viel Glück! – par

Verwandte Themen