squarehippo10
squarehippo10

Reputation: 1945

Swift refactoring assistance

I have a meter laid out on a storyboard that is comprised of ten segments. There are an additional ten segments on top of the original segments that are colored to simulate a lighted segment - these are outlets. (See image below.) Currently I am using a switch statement to hide and unhide each outlet/segment based on a constantly varying input level. But, as you can see in the code below, it's not pretty. I keep reading that polymorphism is often the way to improve a switch statement, but I can't see how that would help here.

switch input {
case 0...9:
  seg1.hidden = false
  seg2.hidden = true
  seg3.hidden = true
  seg4.hidden = true
  seg5.hidden = true
  seg6.hidden = true
  seg7.hidden = true
  seg8.hidden = true
  seg9.hidden = true
  seg10.hidden = true
case 10...19:
  seg1.hidden = false
  seg2.hidden = false
  seg3.hidden = true
  seg4.hidden = true
  seg5.hidden = true
  seg6.hidden = true
  seg7.hidden = true
  seg8.hidden = true
  seg9.hidden = true
  seg10.hidden = true
  ...
  and on and on for eight more levels.

enter image description here

Upvotes: 3

Views: 67

Answers (2)

Shripada
Shripada

Reputation: 6514

//You can have these segments in an array like this-

let segments = [seg1, seg2, seg3, seg4, seg5,seg6, seg7, seg8, seg9, seg10]

// Function that will setup the segments based on input

func setUpSegmentsForInputValue(segments:[UIView], value:Int) {
    for (index, segment) in segments.enumerate() {
        segment.hidden = (value/10)  != index
    }
}

// Call the function with whatever input values 
setUpSegmentsForInputValue(segments: segments, value: someValue)

Upvotes: 2

riik
riik

Reputation: 4448

You could add all of your outlets to an array. Map the input to an "index range" and then decide in a for loop if outlet is in "index range". Then set hidden property accordingly.

@IBOutlet weak var seg1 = UIView()
@IBOutlet weak var seg2 = UIView()
@IBOutlet weak var seg3 = UIView()
@IBOutlet weak var seg4 = UIView()

...

let segs = [seg1, seg2, seg3, seg4]

let input = 19
let range = 0 ... input / 10

for (index, seg) in segs.enumerate() {
    if range ~= index {
        seg.hidden = false
    }else {
        seg.hidden = true
    }
}

Alternative (instead of the for loop):

@IBOutlet weak var seg1 = UIView()
@IBOutlet weak var seg2 = UIView()
@IBOutlet weak var seg3 = UIView()
@IBOutlet weak var seg4 = UIView()

...

let segs = [seg1, seg2, seg3, seg4]

let input = 19
let range = 0 ... input / 10

segs.enumerate().forEach { index, seg in
    seg.hidden = !(range ~= index)
}

Hope this helps.

Upvotes: 1

Related Questions