加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:56:38 所属栏目:百科 来源:网络整理
导读:我想明白为什么当我执行params [“bar”] = str时我没有得到ImplicitlyUnwrappedOptional但是当我用相同的force unwrapped变量声明params时我得到它. 看下面的游乐场: import UIKitvar str: String!str = "Hello"var params: [String: Any] = [ "foo": str]
我想明白为什么当我执行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”的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读