【问题标题】:Need help rewriting a bool as a ternary operator需要帮助将 bool 重写为三元运算符
【发布时间】:2018-09-19 05:55:24
【问题描述】:

我正在尝试为 if 语句编写更多三元运算符来练习,但我一直在将其转换为三元运算符并需要一些帮助。

我正在尝试为我的状态、导航栏、工具栏和文本滑块的淡入和淡出设置动画。

我有:

var isHidden = false

@objc func textViewTapped(_ sender: UIGestureRecognizer) {  
    navigationController!.setNavigationBarHidden(!isHidden, animated: false)
    isHidden = navigationController!.isNavigationBarHidden

    UIView.animate(withDuration: 0.5, animations: {
        self.toolbar.isHidden = self.toolbar.isHidden ? false : true
        self.textSlider.isHidden = self.textSlider.isHidden ? false : true
        self.setNeedsStatusBarAppearanceUpdate()
    }, completion: nil)
}

如您所见,我将工具栏和 textSlider 用作三元运算符。我需要帮助转换这个位:

navigationController!.setNavigationBarHidden(!isHidden, animated: false)
    isHidden = navigationController!.isNavigationBarHidden

这进入了我看不到的视图,我在尝试转换它时感到很困惑。

【问题讨论】:

  • 感谢您想练习使用三元运算符,但最终您应该争取可读性,您确定使用三元运算符比您现有的更具可读性吗?
  • @TommyBs 这是有效的。诚然,在我的初学者阶段,所有三元运算符对我来说都不是那么可读。

标签: ios swift


【解决方案1】:

这里不需要使用三元运算符,直接写就够了:

UIView.animate(withDuration: 0.5, animations: {
    self.toolbar.isHidden = !self.toolbar.isHidden
    self.textSlider.isHidden = !self.textSlider.isHidden
    self.setNeedsStatusBarAppearanceUpdate()
}, completion: nil)

但我猜你这样做是为了练习使用三元运算符,但请注意,有些情况下三元运算符根本没有用。并非每个 if 语句都可以转换为一个。例如这个:

if someCondition {
    someAction1()
    someAction2()
} else {
    someActon3()
    someAction4()
}

你不能写两条语句作为三元运算符的操作数之一。

对于有问题的两行,您可以遵循与上述行相同的逻辑:

navigationController!.setNavigationBarHidden(isHidden ? false : true, animated: false)
isHidden = isHidden ? false : true // this is really redundant...

三元运算符更合适的用例是当您想根据条件使用非Bool 类型的不同值时。例如:

label.text = isHidden ? "I am hidden!" : "I am visible!"

【讨论】:

  • 您可以使用获取导航隐藏状态的 getter 声明 isHidden。我猜会更容易吗?
  • @RakeshaShastri 这可能是 OP 的意思,但我的信息太少,所以 isHidden 可能不仅仅与隐藏的导航栏相关。
  • @Sweeper 谢谢。 isHidden 让我失望了。也感谢您解释适当的用途。我刚开始使用它们,我兴奋地发现它们在我的应用程序中缩减了我的代码行,我想我有点过分热心了。
【解决方案2】:

Swift 4.2 / Xcode 10 提供了 Bool .toggle() 函数。或者您可以为早期版本推出自己的版本:

extension Bool {

    mutating func toggle() {
        self = !self
    }

}

只是让更改 Bool 值更加直观。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多