我想了解为什么在执行 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
,则移除,否则插入展开的值。
- 在 Swift 4.1 中,IUO 值
str
将隐式转换为Optional
,然后可以将其传递给下标。 - 在 Swift 4.2 中,IUO 类型已经被移除,所以
str
已经是 一个Optional
,可以直接传递给下标没有任何中间转换。
在这两种情况下,str
的解包值都被插入到字典中,这就是您看到它被解包的原因。如果 str
为 nil
,则不会插入键 “bar”
的值。
关于swift - ImplicitlyUnwrappedOptional in init vs later,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051964/