这个问题是关于我在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]
返回一行的行为相同?map
有两个版本:一个在阵列上运行,另一个在可选项上运行。
你的grid
是可选的,即使它是一个隐式解包的可选(IUO),它仍然是可选的。 Swift会尽可能将IUO视为可选项,并且仅在需要展开类型时强制解除该值。
因此,使用map
的可选版本而不是您期望的版本。通过明确地用grid
展开!
,然后允许使用所需版本的map
。
map
如何在可选项上工作?
将map应用于可选项时,它会将闭包应用于展开的值。如果可选的是nil
,则没有任何反应。
因此,grid
被打开并变成$0
,并且封闭返回$0[0]
,这是grid
的第一行。
注意:在Xcode中,如果你在每个语句中选择map
,你会看到第一个说:
当此Optional实例不为nil时,计算给定的闭包,将未包装的值作为参数传递。
第二个:
返回一个数组,其中包含在序列元素上映射给定闭包的结果。