Kinja
Kinja

Reputation: 459

Switch statement for UserDefaults (Swift-Xcode)

I would like to know how i could do a switch-case/any good statement for user defaults instead of using if-else because as you can see from my code, i'm using 3 if statements which is abit redundant and ugly. The purpose of this view controller is for a "Pick a card" game, the user gets to pick 3 cards each time and if he/she selects a card, they will not be able to select that particular card again.

import UIKit

class ViewController: UIViewController {
    @IBOutlet var buttona: UIButton!
    @IBOutlet var buttonb: UIButton!
    @IBOutlet var buttonc: UIButton!

    override func viewDidLoad() {
       super.viewDidLoad()
       if (UserDefaults.standard.integer(forKey: "dissapear") == 1)
       {
           buttona.setImage(UIImage(named: "wildcardbackingblack.png"), for: .normal)
           buttona.isEnabled = false
       }

       if (UserDefaults.standard.integer(forKey: "dissapear2") == 1)
       {
           buttonb.setImage(UIImage(named: "wildcardbackingblack.png"), for: .normal)
           buttonb.isEnabled = false
       }

       if (UserDefaults.standard.integer(forKey: "dissapear3") == 1)
       {
           buttonc.setImage(UIImage(named: "wildcardbackingblack.png"), for: .normal)
           buttonc.isEnabled = false
       }
   }

   override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
   }

   @IBAction func Button1(_ sender: Any) {
      UserDefaults.standard.set(1, forKey:"dissapear")
      self.performSegue(withIdentifier: "show", sender: nil)         
   }

   @IBAction func Button2(_ sender: Any) {
      UserDefaults.standard.set(1, forKey:"dissapear2")
      self.performSegue(withIdentifier: "show", sender: nil)
   }

   @IBAction func Button3(_ sender: Any) {
      UserDefaults.standard.set(1, forKey:"dissapear3")
      self.performSegue(withIdentifier: "show", sender: nil)
    }
 }

enter image description here enter image description here

Upvotes: 0

Views: 348

Answers (2)

Alexander
Alexander

Reputation: 63271

Here is how I would write this code, if I were sticking to the same UserDefaults storage. Note: you need to reconnect cardPressed(_:) to every button/card

import UIKit

class ViewController: UIViewController {
    @IBOutlet var buttonA: UIButton!
    @IBOutlet var buttonB: UIButton!
    @IBOutlet var buttonC: UIButton!

    let buttonKeyPairs: [(button: UIButton, key: String)] = [
        (buttonA, "dissapear"),
        (buttonB, "dissapear2"),
        (buttonC, "dissapear3"),
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        for (button, key) in buttonKeyPairs
            where UserDefaults.standard.integer(forKey: key) == 1 {

            button.setImage(UIImage(named: "wildcardbackingblack.png"), for: .normal)
            button.isEnabled = false
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func buttonPressed(_ sender: UIButton) {
        let key: String
        switch UIButton {
            case buttonA: key = "dissapear"
            case buttonB: key = "dissapear2"
            case buttonC: key = "dissapear3"
        }
        UserDefaults.standard.set(1, forKey: key)
        self.performSegue(withIdentifier: "show", sender: self)         
    }
}

Upvotes: 1

belagoesr
belagoesr

Reputation: 168

    func updateCard(button: UIButton, image: String, isEnabled: Bool) {
        DispatchQueue.main.asyc {
            button.setImage(UIImage(named:image), for: .normal)
            button.isEnabled = isEnabled
        }
    }

    .
    .
    .

    let option : Int = UserDefaults.standard.integer(forKey: "dissapear")
    switch (option) {
        case 1:
            self.updateCard(button: ..., image:"wildcardbackingblack.png", isEnabled: false)
        case 2:                       
            self.updateCard(button: ..., image:"wildcardbackingblack.png", isEnabled: false)
        case 3:
            self.updateCard(button: ..., image:"wildcardbackingblack.png", isEnabled: false)
        default:
            self.updateCard(button: ..., image:"default.png", isEnabled: false)
    } 
//Save the different integer value in same key user defaults.

 @IBAction func Button1(_ sender: Any) {
      UserDefaults.standard.set(1, forKey:"dissapear")
      self.performSegue(withIdentifier: "show", sender: nil)         
   }

   @IBAction func Button2(_ sender: Any) {
      UserDefaults.standard.set(2, forKey:"dissapear")
      self.performSegue(withIdentifier: "show", sender: nil)
   }

   @IBAction func Button3(_ sender: Any) {
      UserDefaults.standard.set(3, forKey:"dissapear")
      self.performSegue(withIdentifier: "show", sender: nil)
    }

Upvotes: 1

Related Questions