微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想明白为什么当我执行params [“bar”] = str时我没有得到ImplicitlyUnwrappedOptional但是当我用相同的force unwrapped变量声明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")]

解决方法

在Swift 4.1中,当你这样做时:

var str: String!

str = "Hello"

var params: [String: Any] = [
    "foo": str
]

ImplicitlyUnwrappedOptional(IUO)值被强制转换为Any,这就是它在字典中显示为IUO的原因.它不会被强制解包,因为编译器只会在上下文要求其解包类型时强制解包IUO,而Any则不是这种情况.

但是,最终使用ImplicitlyUnwrappedOptional值的事实是遗留行为.通过在Swift 4.2中删除IUO类型,您将在字典中获得一个Optional值,它将打印为Optional(“Hello”).

在此Q& A中有更多关于上述行为的讨论:

> Why does implicitly unwrapped optional not unwrap in dictionary of type [String : Any]

当你这样做时:

params["bar"] = str

你正在使用Dictionary的下标(key:Key) – >值?,取可选值 – 如果传递nil则执行删除,否则执行未包装值的插入.

>在Swift 4.1中,IUO值str将被隐式转换为Optional,然后可以将其传递给下标.
>在Swift 4.2中,IUO类型已被删除,因此str已经是一个Optional,它可以直接传递给下标而无需任何中间转换.

在这两种情况下,str的unwrapped值都会插入到字典中,这就是为什么你看到它被解包的原因.如果str为零,则不会插入关键“bar”的值.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐