我想明白为什么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)
在 Swift 4.1 中,当您执行以下操作时:
\n\nvar str: String!\n\nstr = "Hello"\n\nvar params: [String: Any] = [\n "foo": str\n]\nRun Code Online (Sandbox Code Playgroud)\n\n(IUO)值ImplicitlyUnwrappedOptional被强制为Any,这就是它在字典中显示为 IUO 的原因。它不会被强制解包,因为编译器只会在上下文需要其解包类型时强制解包 IUO,但情况并非如此Any.
ImplicitlyUnwrappedOptional 然而,您最终得到一个值的事实是遗留行为。随着 Swift 4.2 中删除 IUO 类型,您将Optional在字典中获得一个值,该值将打印为Optional("Hello").
此问答中对上述行为有更多讨论:
\n\n\n\n当你这样做时:
\n\nparams["bar"] = str\nRun Code Online (Sandbox Code Playgroud)\n\n您正在使用Dictionary\'s subscript(key: Key) -> Value?,它采用Optional值 \xe2\x80\x93 执行删除,如果nil,否则插入未包装的值。
str将隐式转换为Optional,然后可以传递给下标。str已经是Optional,它可以直接传递给下标,无需任何中间转换。在这两种情况下,str\ 的未包装值都会插入到字典中,这就是您将其视为未包装的原因。如果str是nil,则该密钥没有任何价值"bar",则不会插入
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |