使用map隐式解开可选的奇怪行为

问题描述 投票:1回答:1

我发现了什么

这个问题是关于我在Swift语言中发现有点奇怪的事情。我遇到了这种行为,因为这是我的代码中的一个错误。

如果我为网格创建一个数组作为隐式解包的可选项,那么map表现得很奇怪。看看这段代码:

let grid: [[Int]]! = [ // May be defined like this if set later on
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]


print(grid.map { $0[0] }!)
// Prints "[1, 2, 3]" (not what I wanted)

print(grid!.map { $0[0] })
// Prints "[1, 4, 7]" (what I wanted)

我知道这行可以通过grid[0]来获得。但是,我想要一个专栏。

我尝试了上面的第一种方法,它只给出行而不是列。第二种方法起作用并给出了专栏。

原因是什么?

我将grid定义为[[Int]]!,这是一个隐式解包的可选项。

  • 为什么我需要强行解开grid才能正确使用map
  • 为什么第一种方法与使用grid[0]返回一行的行为相同?
swift optional
1个回答
2
投票

map有两个版本:一个在阵列上运行,另一个在可选项上运行。

你的grid是可选的,即使它是一个隐式解包的可选(IUO),它仍然是可选的。 Swift会尽可能将IUO视为可选项,并且仅在需要展开类型时强制解除该值。

因此,使用map的可选版本而不是您期望的版本。通过明确地用grid展开!,然后允许使用所需版本的map

map如何在可选项上工作?

将map应用于可选项时,它会将闭包应用于展开的值。如果可选的是nil,则没有任何反应。

因此,grid被打开并变成$0,并且封闭返回$0[0],这是grid的第一行。


注意:在Xcode中,如果你在每个语句中选择map,你会看到第一个说:

当此Optional实例不为nil时,计算给定的闭包,将未包装的值作为参数传递。

第二个:

返回一个数组,其中包含在序列元素上映射给定闭包的结果。

© www.soinside.com 2019 - 2024. All rights reserved.