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,然后可以将其传递给下标. 在这两种情况下,str的unwrapped值都会插入到字典中,这就是为什么你看到它被解包的原因.如果str为零,则不会插入关键“bar”的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |