我发现此代码的结果很奇怪
@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>
答案 0 :(得分:2)
@IBOutlet
被定义为隐式解包的选项 - 这就是!
在类型末尾所代表的含义。它仍然是可选的,但您在使用时不必显式展开它。您可以将此视为对编译器的承诺,尽管此值在某些时候可能是nil
,但您将负责任地使用它,并且只有在设置之后才能使用它。在推断deselectThis
的类型时,编译器正确地设置它Optional<UIButton>
,只是没有!
(因为!
在这种情况下不改变类型本身)
您可以将整个表达式包装在if let
语句中,或者只是通过执行var deselectThis: UIButton! = ...
提供明确解开的输入。
请注意,应谨慎使用隐式展开的选项。一如既往 - more in the docs。