作者:手机用户2602903715 | 来源:互联网 | 2023-10-13 07:50
我有这个代码示例。
var nullAbleName: String? = null
var v = "I cannot be null"
//! v = nullAbleName // mismatch
nullAbleName = "abc"
v = nullAbleName // Now OK.
nullAbleName 是一个变量,它的值应该在运行时确定。“v”的第二次赋值可以的逻辑是什么?是不是我很幸运,因为编译器碰巧知道 nullAbleName 有值?
回答
这称为智能铸造。编译器能够看到局部变量最近被设置为显式字符串,因此它将其视为非空。您可能会注意到,IDE 对分配的颜色/突出显示有所不同,以表明它正在使用智能投射。
这仅适用于尚未被修改它们的闭包捕获的局部变量(例如,创建一个修改局部变量值的回调实例)。因此属性不适合智能转换,因为它们不是局部变量(并且可以在其他地方更改)并且在闭包中捕获的局部变量不符合条件(因为它们可以通过闭包在其他地方更改)。