如何缩短这段代码以防止代码重复?
How to shorten this code to prevent duplication of code?
这个问题我问了很久。我正在尝试可视化 3 门问题,只是为了好玩和练习 Swift。所以我有:
3 扇门,因此有 3 个不同的 IBActions &
所有门的 3 种功能。这些功能完全相同,只是每个代码中的门数不同。所以我想知道,我可以缩短这段代码吗?:
func openSecondChoice(whatDoorIsClickedOn: Int)
{
if whatDoorIsClickedOn == 1
{
if whatDoorIsClickedOn == doorWithNumber
{
UIButtonDoor1.setBackgroundImage( UIImage (named: "doorWithMoney"), for: UIControlState.normal)
}
else
{
UIButtonDoor1.setBackgroundImage( UIImage (named: "doorWithGoat"), for: UIControlState.normal)
}
}
if whatDoorIsClickedOn == 2
{
if whatDoorIsClickedOn == doorWithNumber
{
UIButtonDoor2.setBackgroundImage( UIImage (named: "doorWithMoney"), for: UIControlState.normal)
}
else
{
UIButtonDoor2.setBackgroundImage( UIImage (named: "doorWithGoat"), for: UIControlState.normal)
}
}
if whatDoorIsClickedOn == 3
{
if whatDoorIsClickedOn == doorWithNumber
{
UIButtonDoor3.setBackgroundImage( UIImage (named: "doorWithMoney"), for: UIControlState.normal)
}
else
{
UIButtonDoor3.setBackgroundImage( UIImage (named: "doorWithGoat"), for: UIControlState.normal)
}
}
}
呸!这段代码太丑了!例如,如果用户按下 door1,我将调用函数 "openSecondChoise(whatDoorIsClickedOn: 1)"。有没有办法缩短这个?谢谢!我这里不使用类,我应该使用它们吗?
通常,当您开始使用 1
、2
、3
等为变量名添加后缀时,就该使用数组了。这就是数组的用途。
使用包含您的 UIButtonDoor1
...UIButtonDoor3
的数组 uiButtonDoors
,您的函数可能如下所示:
func openSecondChoice(whatDoorIsClickedOn: Int) {
let imageName = whatDoorIsClickedOn == doorWithNumber ? "doorWithMoney" : "doorWithGoat"
uiButtonDoors[whatDoorIsClickedOn - 1].setBackgroundImage(UIImage(named: imageName), for: UIControlState.normal)
}
func openSecondChoice(whatDoorIsClickedOn: Int) {
let imageName = whatDoorIsClickedOn == doorWithNumber ? "doorWithMoney" : "doorWithGoat"
let image = UIImage(named: imageName)
let button: UIButton
switch whatDoorIsClickedOn {
case 1:
button = UIButtonDoor1
case 2:
button = UIButtonDoor2
case 3:
button = UIButtonDoor3
default:
fatalError("Cannot be. Switch must be exhaustive, that's why we need to use 'default' for a switch on Int.")
}
button.setBackgroundImage(image, for: .normal)
}
对于较短的版本,请查看@tuple_cat 的回答。
另一种方法,为了好玩。
import UIKit
class DoorGame {
func setupButtons() {
let buttons = [UIButton(), UIButton(), UIButton()]
for (index, button) in buttons.enumerated() {
button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
button.setTitle("\(index)", for: .normal)
}
let winningIndex = Int(arc4random_uniform(UInt32(buttons.count)))
buttons[winningIndex].tag = 1
}
@objc func buttonTapped(_ sender: UIButton) {
let imageName = sender.tag == 1 ? "doorWithMoney" : "doorWithGoat"
let image = UIImage(named: imageName)
sender.setBackgroundImage(image, for: .normal)
}
}
这个问题我问了很久。我正在尝试可视化 3 门问题,只是为了好玩和练习 Swift。所以我有:
3 扇门,因此有 3 个不同的 IBActions & 所有门的 3 种功能。这些功能完全相同,只是每个代码中的门数不同。所以我想知道,我可以缩短这段代码吗?:
func openSecondChoice(whatDoorIsClickedOn: Int)
{
if whatDoorIsClickedOn == 1
{
if whatDoorIsClickedOn == doorWithNumber
{
UIButtonDoor1.setBackgroundImage( UIImage (named: "doorWithMoney"), for: UIControlState.normal)
}
else
{
UIButtonDoor1.setBackgroundImage( UIImage (named: "doorWithGoat"), for: UIControlState.normal)
}
}
if whatDoorIsClickedOn == 2
{
if whatDoorIsClickedOn == doorWithNumber
{
UIButtonDoor2.setBackgroundImage( UIImage (named: "doorWithMoney"), for: UIControlState.normal)
}
else
{
UIButtonDoor2.setBackgroundImage( UIImage (named: "doorWithGoat"), for: UIControlState.normal)
}
}
if whatDoorIsClickedOn == 3
{
if whatDoorIsClickedOn == doorWithNumber
{
UIButtonDoor3.setBackgroundImage( UIImage (named: "doorWithMoney"), for: UIControlState.normal)
}
else
{
UIButtonDoor3.setBackgroundImage( UIImage (named: "doorWithGoat"), for: UIControlState.normal)
}
}
}
呸!这段代码太丑了!例如,如果用户按下 door1,我将调用函数 "openSecondChoise(whatDoorIsClickedOn: 1)"。有没有办法缩短这个?谢谢!我这里不使用类,我应该使用它们吗?
通常,当您开始使用 1
、2
、3
等为变量名添加后缀时,就该使用数组了。这就是数组的用途。
使用包含您的 UIButtonDoor1
...UIButtonDoor3
的数组 uiButtonDoors
,您的函数可能如下所示:
func openSecondChoice(whatDoorIsClickedOn: Int) {
let imageName = whatDoorIsClickedOn == doorWithNumber ? "doorWithMoney" : "doorWithGoat"
uiButtonDoors[whatDoorIsClickedOn - 1].setBackgroundImage(UIImage(named: imageName), for: UIControlState.normal)
}
func openSecondChoice(whatDoorIsClickedOn: Int) {
let imageName = whatDoorIsClickedOn == doorWithNumber ? "doorWithMoney" : "doorWithGoat"
let image = UIImage(named: imageName)
let button: UIButton
switch whatDoorIsClickedOn {
case 1:
button = UIButtonDoor1
case 2:
button = UIButtonDoor2
case 3:
button = UIButtonDoor3
default:
fatalError("Cannot be. Switch must be exhaustive, that's why we need to use 'default' for a switch on Int.")
}
button.setBackgroundImage(image, for: .normal)
}
对于较短的版本,请查看@tuple_cat 的回答。
另一种方法,为了好玩。
import UIKit
class DoorGame {
func setupButtons() {
let buttons = [UIButton(), UIButton(), UIButton()]
for (index, button) in buttons.enumerated() {
button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
button.setTitle("\(index)", for: .normal)
}
let winningIndex = Int(arc4random_uniform(UInt32(buttons.count)))
buttons[winningIndex].tag = 1
}
@objc func buttonTapped(_ sender: UIButton) {
let imageName = sender.tag == 1 ? "doorWithMoney" : "doorWithGoat"
let image = UIImage(named: imageName)
sender.setBackgroundImage(image, for: .normal)
}
}