swift - 代码重构 - Swift
问题描述
我认为我关于按钮的代码违反了 DRY 原则。你能建议一种更有效的方法来减少混乱吗?
@IBAction func competitiveButton(_ sender: Any) {
if competitiveMatch.isEnabled == true {
competitiveMatch.isEnabled = false
friendlyMatch.isEnabled = true
tournamentButton.isEnabled = true
trainingButton.isEnabled = true
} else {
competitiveMatch.isEnabled = true
}
}
@IBAction func friendlyButton(_ sender: Any) {
if friendlyMatch.isEnabled == true {
friendlyMatch.isEnabled = false
tournamentButton.isEnabled = true
competitiveMatch.isEnabled = true
trainingButton.isEnabled = true
} else {
friendlyMatch.isEnabled = true
}
}
@IBAction func tourneyButton(_ sender: Any) {
if tournamentButton.isEnabled == true {
tournamentButton.isEnabled = false
friendlyMatch.isEnabled = true
trainingButton.isEnabled = true
competitiveMatch.isEnabled = true
} else {
tournamentButton.isEnabled = true
}
}
@IBAction func trainingButton(_ sender: Any) {
if trainingButton.isEnabled == true {
trainingButton.isEnabled = false
friendlyMatch.isEnabled = true
tournamentButton.isEnabled = true
competitiveMatch.isEnabled = true
} else {
trainingButton.isEnabled = true
}
}
代码遵循所有四个按钮的设置模式。我无法考虑使用更短的方法来做同样的事情。请帮忙。完整的初学者在这里。
解决方案
您可以使用单个IBAction
而不是 4 个单独的方法。并使发件人类型为UIButton
from Any
。然后你可以做类似的事情
@IBAction func toggleEnableDisable(_ sender: UIButton) {
let currentValue = sender.isEnabled
let buttonArray = [trainingButton, friendlyMatch, tournamentButton, competitiveMatch]
buttonArray.forEach { $0.isEnabled = false }
sender.isEnabled = !currentValue
}
推荐阅读
- java - 将文件从 box 文件夹复制到 AWS s3 存储桶
- google-bigquery - Firebase 与 BigQuery 活跃用户不同
- java - 每次单击按钮时,如何使用 JButton 更改 JLabel?
- google-app-maker - 在 DEPLOYMENTS 下的“仅允许访问特定用户”中检索用户列表
- c# - C# Linq 嵌套类 - 条件不起作用的地方
- xml - 如何在 PostgreSQL 中从 XML 查询兄弟节点
- java - 为什么 Java 全屏独占模式没有运行我的最大屏幕分辨率?
- laravel - 验证特定规则 - Laravel
- google-maps - 如何为我的项目获取 Google 地图 3d 建筑地形?
- c++ - 在构造函数中使用结构