我想明白为什么当我执行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] 举报,一经查实,本站将立刻删除。