这个问题是关于我发现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]
返回一行的行为相同?答案 0 :(得分:2)
map
有两种版本:一种在数组上运行,另一种在 optionals 上运行。
您的grid
是可选,即使它是隐式解包的可选(IUO),它仍然是可选 >。 Swift将在可能的情况下将IUO视为可选,并且仅在需要使用未包装的类型时才强制将其包装。
因此,使用了map
的可选版本,而不是您期望的版本。通过用grid
显式解开!
,可以使用所需的map
版本。
map
在可选上如何工作?
将地图应用于可选时,它将闭包应用于展开的值。如果可选为nil
,则什么都不会发生。
因此,grid
被解包并变为$0
,并且闭包返回$0[0]
,它是grid
的第一行。
注意:在Xcode中,如果您在每个语句中 option -点击map
,您将看到第一个语句:
当此Optional实例不为nil时,计算给定的闭包, 将展开的值作为参数传递。
和第二个:
返回一个数组,其中包含映射给定闭包的结果 在序列的元素上。