Swift:需要根据按下的按钮重构大量整数
Swift: Need to refactor incrementing a lot of integers based on which button is pushed
我有很多整数需要在按下某些按钮时加一。这是我如何实现这一目标的简短版本。
@IBAction func incrementAction(_ sender: UIButton) {
switch sender.tag {
case 0:
redCount += 1
case 1:
blueCount += 1
case 2:
greenCount += 1
default:
()
}
}
这可行,但我不希望 switch case 列表变得太长。另外,我认为这有点违反 DRY
概念。
我尝试通过执行以下操作解决此问题。
let colorArray = [redCount, blueCount, greenCount]
var colorCount = colorArray[sender.tag]
colorCount += 1
但是,数组中的整数不会单独更新。
字典似乎是最适合这项工作的数据结构。而不是使用标签来标识视图,您应该向其添加 Color
,并直接引用它。
import AppKit
enum Colour: CaseIterable { case red, green, blue }
class MyColouredButton: UIButton {
var colour: Colour = .red // some default value, change this.
}
class MyVC: UIViewController {
var colourCounts = [Colour: Int]()
@IBAction func incrementAction(_ sender: MyColouredButton) {
colourCounts[sender.colour, default: 0] += 1
}
}
您可以尝试这样的操作:
enum Color: Int {
case red = 0
case blue = 1
case green = 2
}
var colors: [Color : Int] = [.red : 0, .green : 0, .blue : 0]
func incrementColorCount(tag: Int) {
guard let color = Color(rawValue: tag), let colorCount = colors[color] else {
print("Invalid color")
return
}
colors[color] = colorCount + 1
}
// Test
incrementColorCount(tag: 0)
incrementColorCount(tag: 1)
colors.forEach {
print("Color: \([=10=].key) has been hit \([=10=].value) times")
}
//Color: red has been hit 1 times
//Color: green has been hit 0 times
//Color: blue has been hit 1 times
我有很多整数需要在按下某些按钮时加一。这是我如何实现这一目标的简短版本。
@IBAction func incrementAction(_ sender: UIButton) {
switch sender.tag {
case 0:
redCount += 1
case 1:
blueCount += 1
case 2:
greenCount += 1
default:
()
}
}
这可行,但我不希望 switch case 列表变得太长。另外,我认为这有点违反 DRY
概念。
我尝试通过执行以下操作解决此问题。
let colorArray = [redCount, blueCount, greenCount]
var colorCount = colorArray[sender.tag]
colorCount += 1
但是,数组中的整数不会单独更新。
字典似乎是最适合这项工作的数据结构。而不是使用标签来标识视图,您应该向其添加 Color
,并直接引用它。
import AppKit
enum Colour: CaseIterable { case red, green, blue }
class MyColouredButton: UIButton {
var colour: Colour = .red // some default value, change this.
}
class MyVC: UIViewController {
var colourCounts = [Colour: Int]()
@IBAction func incrementAction(_ sender: MyColouredButton) {
colourCounts[sender.colour, default: 0] += 1
}
}
您可以尝试这样的操作:
enum Color: Int {
case red = 0
case blue = 1
case green = 2
}
var colors: [Color : Int] = [.red : 0, .green : 0, .blue : 0]
func incrementColorCount(tag: Int) {
guard let color = Color(rawValue: tag), let colorCount = colors[color] else {
print("Invalid color")
return
}
colors[color] = colorCount + 1
}
// Test
incrementColorCount(tag: 0)
incrementColorCount(tag: 1)
colors.forEach {
print("Color: \([=10=].key) has been hit \([=10=].value) times")
}
//Color: red has been hit 1 times
//Color: green has been hit 0 times
//Color: blue has been hit 1 times