swift - 在 Swift 2.2 中显式展开对可选属性的赋值

标签 swift option-type

我在审查 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 - 在 Swift 2.2 中显式展开对可选属性的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39606845/

相关文章:

ios - 移动 map View 相机时更新纬度和经度?

arrays - Swift:可选数组计数

swift - "guard let"和 "if let"是否与 "guard"和 "if"不同?

ios - 无法将类型 'Authorize.ClubsViewController' (0x109c70cc8) 的值转换为 'Authorize.NewViewController' (0x109c70df8)

ios - SystemConfiguration.CaptiveNetwork 在 iOS 12 上不起作用

SwiftUI 线程 1 : Fatal error: No ObservableObject of type SessionStore found

swift - WkWebView 中 PDF 的第一页呈现像素化

swift - 可选协议(protocol)要求,我无法让它工作

java - 可选 vs if/else-if 性能 java 8

function - 使用 F# 的“选项<unit->unit> 类型和等式”