2016-09-21 40 views
1

我看到这个在审查雨燕2.2的代码,我很不解:明确的解包分配的可选特性在雨燕2.2

(myVar?.aProperty=aValue)! 

其中安勤为不可选。

这个表达式的结果不存储在任何地方,因此为什么放一个!最后?另外,这种表达方式的术语是什么?

+0

IMO,你是对的。表达结果不被使用。 –

回答

1

它在闭包中使用时有点不同。

let closure1 = { 
    aVar?.aProperty = aValue 
} 
let closure2 = { 
    (aVar?.aProperty = aValue)! 
} 

夫特推断的closure1类型()->Optional<()>,又名()->Void?。这与()->Void不一样。因此,closure1不能传递给声称为()->Void的参数。

所以,如果你想关闭的类型()->Void,你可能需要编写这样的事:

let closure1 = { 
    _ = aVar?.aProperty = aValue 
} 

或者这样:

let closure1 = { 
    aVar?.aProperty = aValue 
    return 
} 

要不然:

let closure1 = { 
    (aVar?.aProperty = aValue)! 
} 

现在,你可以写这样的东西:

let closure1:()->Void = { 
    aVar?.aProperty = aValue 
} 

但是,在旧的Swift中,最后一个例子没有编译。


如果您在完全不同的上下文中发现该代码而不是闭包,我无法猜测目的是什么。

+0

很好的解释。然而,代码被嵌入到不返回任何值的func中。 – andrewz