swift - ImplicitlyUnwrappedOptional in init vs later

标签 swift swift4

我想了解为什么在执行 params["bar"] = str 时没有得到 ImplicitlyUnwrappedOptional 但在声明 时却得到了它params 具有相同的强制展开变量。

请看下面的 Playground :

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 value 的事实是遗留行为。随着 Swift 4.2 中 IUO 类型的移除,您将在字典中获得一个 Optional 值,它将打印为 Optional("Hello")

在这个问答中有更多关于上述行为的讨论:

当你这样做时:

params["bar"] = str

您正在使用 Dictionarysubscript(key: Key) -> Value?,它接受一个 Optional 值——执行一个如果传递了 nil,则移除,否则插入展开的值。

  • 在 Swift 4.1 中,IUO 值 str 将隐式转换为 Optional,然后可以将其传递给下标。
  • 在 Swift 4.2 中,IUO 类型已经被移除,所以 str 已经是 一个 Optional,可以直接传递给下标没有任何中间转换。

在这两种情况下,str 的解包值都被插入到字典中,这就是您看到它被解包的原因。如果 strnil,则不会插入键 “bar” 的值。

关于swift - ImplicitlyUnwrappedOptional in init vs later,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051964/

相关文章:

iOS 动态 UI 简单来说?

swift - 在 Swift 中将匿名数组作为参数传递

ios - Swift 4.2 - 解码相同 key 不同类型的 JSON

swift 4.0 : How do i move all the NSArray values to NSDictionary dynamically?

ios - 如何在 iOS 上扫描条形码?

swift - 如何安全地解开 header 值

ios - 嵌套 Controller + View ,以编程方式添加约束,哪个地方?最佳实践?

ios - 单元测试: Emulate that user has specific calendar

ios - 将 key 与 iOS swift 4 中的字典数组进行比较

json - Swift 4 可解码,直到解码时才知道 key