在 Swift 2.2 中显式展开对可选 属性 的赋值
Explicitly unwrapping an assignment to an optional property in Swift 2.2
我在查看 Swift 2.2 代码时看到这个,我很困惑:
(myVar?.aProperty=aValue)!
其中 aValue 不是可选的。
这个表达式的结果没有存储在任何地方,因此为什么要放一个 !在末尾?另外,这种表达的术语是什么?
在闭包中使用时会有些不同。
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,最后一个例子没有编译。
如果您发现该代码处于与闭包完全不同的上下文中,我无法猜出其目的是什么。
我在查看 Swift 2.2 代码时看到这个,我很困惑:
(myVar?.aProperty=aValue)!
其中 aValue 不是可选的。
这个表达式的结果没有存储在任何地方,因此为什么要放一个 !在末尾?另外,这种表达的术语是什么?
在闭包中使用时会有些不同。
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,最后一个例子没有编译。
如果您发现该代码处于与闭包完全不同的上下文中,我无法猜出其目的是什么。