在init与之后的隐式解包可选

all*_*ire 5 swift swift4

我想明白为什么ImplicitlyUnwrappedOptional当我这样做时我没有params["bar"] = str得到但是当我params用相同的力量解包变量声明时我得到它.

看下面的游乐场:

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")]
Run Code Online (Sandbox Code Playgroud)

Ham*_*ish 1

在 Swift 4.1 中,当您执行以下操作时:

\n\n
var str: String!\n\nstr = "Hello"\n\nvar params: [String: Any] = [\n    "foo": str\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

(IUO)值ImplicitlyUnwrappedOptional被强制为Any,这就是它在字典中显示为 IUO 的原因。它不会被强制解包,因为编译器只会在上下文需要其解包类型时强制解包 IUO,但情况并非如此Any.

\n\n

ImplicitlyUnwrappedOptional 然而,您最终得到一个值的事实是遗留行为。随着 Swift 4.2 中删除 IUO 类型,您将Optional在字典中获得一个值,该值将打印为Optional("Hello").

\n\n

此问答中对上述行为有更多讨论:

\n\n\n\n

当你这样做时:

\n\n
params["bar"] = str\n
Run Code Online (Sandbox Code Playgroud)\n\n

您正在使用Dictionary\'s subscript(key: Key) -> Value?,它采用Optional值 \xe2\x80\x93 执行删除,如果nil,否则插入未包装的值。

\n\n
    \n
  • 在 Swift 4.1 中,IUO 值str将隐式转换为Optional,然后可以传递给下标。
  • \n
  • 在 Swift 4.2中,IUO 类型已被删除,因此str已经Optional,它可以直接传递给下标,无需任何中间转换。
  • \n
\n\n

在这两种情况下,str\ 的未包装值都会插入到字典中,这就是您将其视为未包装的原因。如果strnil,则该密钥没有任何价值"bar",则不会插入

\n