使用地图

时间:2019-04-21 12:03:40

标签: swift optional

我发现了什么

这个问题是关于我发现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]返回一行的行为相同?

1 个答案:

答案 0 :(得分:2)

map有两种版本:一种在数组上运行,另一种在 optionals 上运行。

您的grid可选,即使它是隐式解包的可选(IUO),它仍然是可选 >。 Swift将在可能的情况下将IUO视为可选,并且仅在需要使用未包装的类型时才强制将其包装。

因此,使用了map可选版本,而不是您期望的版本。通过用grid显式解开!,可以使用所需的map版本。

map可选上如何工作?

将地图应用于可选时,它将闭包应用于展开的值。如果可选nil,则什么都不会发生。

因此,grid被解包并变为$0,并且闭包返回$0[0],它是grid的第一行。


注意:在Xcode中,如果您在每个语句中 option -点击map,您将看到第一个语句:

  

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

和第二个:

  

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