Swift 的三元条件运算符从两个非可选值返回可选值?

Swift's Ternary Conditional Operator returning optional from two non-optional values?

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

 @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) 产生编译错误 "Value of optional type 'UIButton?' not unwrapped; did you mean to use '!' or '?'?"。

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

@IBOutlets 被定义为隐式展开的可选值——这就是 ! 在类型末尾所代表的含义。它仍然是可选的,但您不必在使用时显式地解包它。您可以将此视为对编译器的承诺,即尽管此值在某些时候可能是 nil,但您将负责任地使用它,并且只有在设置它之后。在推断 deselectThis 的类型时,编译器正确地将其设置为 Optional<UIButton>,只是没有 !(因为 ! 不会更改类型 per-se例)。

您可以将整个表达式包装在 if let 语句中,或者通过执行 var deselectThis: UIButton! = ....

来简单地提供显式展开的类型

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