我想了解为什么在执行 params["bar"] = str 时没有得到 ImplicitlyUnwrappedOptional 但在声明 时却得到了它params 具有相同的强制展开变量。
请看下面的 Playground :
import UIKit
var str: String!
str = "Hello"
var params: [String: Any] = [
"foo": str
]
params["bar"] = str
print(params)
// ["bar": "Hello", "foo": Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("Hello")]
最佳答案
在 Swift 4.1 中,当您这样做时:
var str: String!
str = "Hello"
var params: [String: Any] = [
"foo": str
]
ImplicitlyUnwrappedOptional (IUO) 值被强制转换为 Any,这就是它在您的字典中显示为 IUO 的原因。它不会被强制解包,因为编译器只会在上下文需要其解包类型时强制解包 IUO,而 Any 则不是这种情况。
然而,您最终得到一个 ImplicitlyUnwrappedOptional value 的事实是遗留行为。随着 Swift 4.2 中 IUO 类型的移除,您将在字典中获得一个 Optional 值,它将打印为 Optional("Hello")。
在这个问答中有更多关于上述行为的讨论:
当你这样做时:
params["bar"] = str
您正在使用 Dictionary 的 subscript(key: Key) -> Value?,它接受一个 Optional 值——执行一个如果传递了 nil,则移除,否则插入展开的值。
str 将隐式转换为 Optional,然后可以将其传递给下标。str 已经是 一个 Optional,可以直接传递给下标没有任何中间转换。在这两种情况下,str 的解包值都被插入到字典中,这就是您看到它被解包的原因。如果 str 为 nil,则不会插入键 “bar” 的值。
关于swift - ImplicitlyUnwrappedOptional in init vs later,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051964/