【问题标题】:How to use != in a switch statement?如何在 switch 语句中使用 !=?
【发布时间】:2018-08-21 20:10:53
【问题描述】:

目前我们有一个带有 5 个按钮的单元格,当按下一个按钮时,它会变成白色,而所有其他按钮都会变成黑色。按钮上有一个单独的复选标记图像视图,将根据按钮是否被选中而被选中或取消选中。太胖了,这适用于 imageView:

 @IBAction func changeColor(_ sender: Any) {
        guard let button = sender as? UIButton else {
            return
        }

        self.selectedCheckMarkImageView1.isHidden = button.tag != 1
        self.selectedCheckMarkImageView2.isHidden = button.tag != 2
        self.selectedCheckMarkImageView3.isHidden = button.tag != 3
        self.selectedCheckMarkImageView4.isHidden = button.tag != 4
        self.selectedCheckMarkImageView5.isHidden = button.tag != 5
}

但是当尝试使用相同的方法来更改按钮图像时:

 button.setImage(UIImage(named: "LR - Nano White - Selected")!, for: .normal) = button.tag != 1

发生错误:

无法赋值:函数调用返回不可变值

我尝试将它放在这样的 switch 语句中:

  switch (button.tag) {

        case != 1: //error occurs here


        default:
           //
        }

但得到错误:

'!=' 不是前缀一元运算符

关于如何解决这个问题的任何想法?

【问题讨论】:

  • case 应该有一个Int 因为标签是Int ?
  • 删除 != 并检查匹配的案例,例如case 1:
  • 你应该重新设置你的@IBOutlet,并选择参数类型为UIButton而不是Any。这样,就不需要强制转换(强制或有条件的)。

标签: ios swift uibutton switch-statement


【解决方案1】:

开关是一个替换值,该值与一组固定的多个值进行比较,以选择要执行的单个分支。您会遇到这样一种情况,即根据多个不同的值检查多个值,并执行多个不同的操作作为响应。一个开关无法真正取代它。

相反,我建议使用for 循环来减少重复。

let selectedCheckMarkImageViews = [
    selectedCheckMarkImageView1,
    selectedCheckMarkImageView2,
    selectedCheckMarkImageView3,
    selectedCheckMarkImageView4,
    selectedCheckMarkImageView5,
]

let visbleImageViewIndex = button.tag // TODO: either number these 0..<4, or add 1 below
for (index, view) in selectedCheckMarkImageViews.enumerated() {
    view.isHidden = visbleImageViewIndex != index
}

【讨论】:

  • 我试图想办法解释这一点! 拍手 拍手
  • @Alexander 这非常适合隐藏/取消隐藏 imageViews,但我想要做的是使用相同的概念将按钮的背景图像更改为“已选择”、“未选择”
  • @SwiftyJD 所以?有什么问题?扩展一下:let isSelected = visbleImageViewIndex == index; view.isHidden = !isSelected; view.backgroundImage = isSelected ? selectedImage : deselectedImage
  • @Alexander 我认为我没有正确解释我想要做什么。我正在尝试使用一组独特的选定图像和一组独特的未选择图像来更改按钮(例如 button.setImage(unselectedImage, for: .normal))。当一个按钮被点击时,它应该根据索引在按钮上显示特定的选定图像,所有其他按钮将自动显示未选择的图像。您提供的代码适用于图像视图,但这有点不同,因为它做了类似的事情:button.setImage(unselectedImage, for: .normal)
  • @SwiftyJD 您只需为每个您关心的UIControl.State 的每个按钮设置一次图像。为什么每次按下按钮都必须更改它们?
【解决方案2】:

试试这个

switch (button.tag) {

        case _ where button.tag != 1: 


        default:
           //
        }

【讨论】:

  • 我试过了,但得到一个错误情况 _ where button.tag != 1: self.selectedCheckMarkImageView1.isHidden//表达式解析为未使用的左值
  • @SwiftyJD self.selectedCheckMarkImageView1.isHidden --> isHidden 是只读属性,您没有使用它,所以错误
  • @SwiftyJD 你在 switch case 中遇到了什么错误?
  • @SwiftyJD你能分享你的switch语句代码吗?
  • switch button.tag { case _ where button.tag != 1: self.selectedCheckMarkImageView1.isHidden case _ where button.tag != 2: self.selectedCheckMarkImageView2.isHidden }
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2014-08-05
  • 2021-12-10
相关资源
最近更新 更多