Swift 重构协助
Swift refactoring assistance
我在由十个片段组成的情节提要板上布置了一个仪表。在原始段的顶部还有另外十个段,这些段被着色以模拟发光的段 - 这些是插座。 (见下图。)目前我正在使用 switch 语句根据不断变化的输入级别隐藏和取消隐藏每个 outlet/segment。但是,正如您在下面的代码中看到的那样,它并不漂亮。我一直在阅读多态性通常是改进 switch 语句的方法,但我看不出这对这里有什么帮助。
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.
您可以将所有网点添加到一个数组中。将输入映射到 "index range",然后在 for 循环中决定出口是否在 "index range" 中。然后相应地设置隐藏属性。
@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
}
}
备选方案(而不是 for 循环):
@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)
}
希望对您有所帮助。
//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)
我在由十个片段组成的情节提要板上布置了一个仪表。在原始段的顶部还有另外十个段,这些段被着色以模拟发光的段 - 这些是插座。 (见下图。)目前我正在使用 switch 语句根据不断变化的输入级别隐藏和取消隐藏每个 outlet/segment。但是,正如您在下面的代码中看到的那样,它并不漂亮。我一直在阅读多态性通常是改进 switch 语句的方法,但我看不出这对这里有什么帮助。
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.
您可以将所有网点添加到一个数组中。将输入映射到 "index range",然后在 for 循环中决定出口是否在 "index range" 中。然后相应地设置隐藏属性。
@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
}
}
备选方案(而不是 for 循环):
@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)
}
希望对您有所帮助。
//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)