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

时间:2018-02-21 23:47:23

标签: swift ternary-operator

我发现此代码的结果很奇怪

 @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(如果它们被定义为弱的话仍然有相同的编译错误),但原因是逃避了我。 / p>

1 个答案:

答案 0 :(得分:2)

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

您可以将整个表达式包装在if let语句中,或者只是通过执行var deselectThis: UIButton! = ...提供明确解开的输入。

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