【问题标题】:Swift's Ternary Conditional Operator returning optional from two non-optional values?Swift 的三元条件运算符从两个非可选值返回可选?
【发布时间】:2018-08-01 17:05:48
【问题描述】:

我发现这段代码的结果很好奇

 @IBOutlet weak var firstButton: UIButton!
 @IBOutlet weak var secondButton: UIButton!


    func selectButton(_ selectThis: UIButton) {
        var deselectThis = (selectThis == firstButton) ? secondButton : firstButton
        setButtonSelectionColor(deselectThis, selectIt: false)
    }

对 setButtonSelectionColor(deselectThis) 的调用会产生编译错误“可选类型 'UIButton?' 的值?”没有打开;你是不是要使用“!”要么 '?'?”。

我猜这与 firstButton 和 secondButton 的声明方式有关,特别是它们是@IBOutlets(如果它们被定义为弱,仍然有相同的编译错误),但原因让我无法理解。

【问题讨论】:

    标签: swift ternary-operator


    【解决方案1】:

    @IBOutlets 被定义为隐式展开的可选项——这就是 ! 在类型末尾的含义。它仍然是可选的,但您不必在使用时显式打开它。您可以将其视为对编译器的一种承诺,尽管此值在某些时候可能是nil,但您将负责任地使用它,并且只有在设置它之后。在推断deselectThis 的类型时,编译器正确设置了Optional<UIButton>,只是没有!(因为在这种情况下! 本身不会改变类型)。

    您可以将整个表达式包装在 if let 语句中,也可以通过 var deselectThis: UIButton! = ... 简单地提供显式解包的类型。

    请注意,应谨慎使用隐式展开的选项。一如既往 - more in the docs

    【讨论】:

    • “被定义为显式展开的选项”你的意思是“隐式展开的选项”
    • 你是对的,我一定是打错了。感谢@vacawama 的编辑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多