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,仍然有相同的编译错误),但原因是逃避我。
@IBOutlet
s 被定义为隐式展开的可选值——这就是 !
在类型末尾所代表的含义。它仍然是可选的,但您不必在使用时显式地解包它。您可以将此视为对编译器的承诺,即尽管此值在某些时候可能是 nil
,但您将负责任地使用它,并且只有在设置它之后。在推断 deselectThis
的类型时,编译器正确地将其设置为 Optional<UIButton>
,只是没有 !
(因为 !
不会更改类型 per-se例)。
您可以将整个表达式包装在 if let
语句中,或者通过执行 var deselectThis: UIButton! = ...
.
来简单地提供显式展开的类型
请注意隐式展开的可选值应谨慎使用。一如既往 - more in the docs.
我发现这段代码的结果很好奇
@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,仍然有相同的编译错误),但原因是逃避我。
@IBOutlet
s 被定义为隐式展开的可选值——这就是 !
在类型末尾所代表的含义。它仍然是可选的,但您不必在使用时显式地解包它。您可以将此视为对编译器的承诺,即尽管此值在某些时候可能是 nil
,但您将负责任地使用它,并且只有在设置它之后。在推断 deselectThis
的类型时,编译器正确地将其设置为 Optional<UIButton>
,只是没有 !
(因为 !
不会更改类型 per-se例)。
您可以将整个表达式包装在 if let
语句中,或者通过执行 var deselectThis: UIButton! = ...
.
请注意隐式展开的可选值应谨慎使用。一如既往 - more in the docs.