在Swift 2.2中明确地将赋值解包为可选属性

时间:2016-09-21 03:01:48

标签: swift optional

我在查看Swift 2.2代码时看到了这一点,我很困惑:

(myVar?.aProperty=aValue)!

其中aValue不是可选的。

这个表达式的结果没有存储在任何地方,因此为什么要放一个!在末尾?此外,这种表达的术语是什么?

1 个答案:

答案 0 :(得分:1)

在闭包中使用时会有所不同。

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

Swift将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中,最后一个例子没有编译。

如果您在完全不同的上下文中找到代码而不是关闭,我无法猜测其目的是什么。