Swift - 为什么在可选数组上调用map时行为不同,而不是直接在数组上调用?

时间:2018-03-24 09:27:49

标签: swift

以下是一个例子:

let d = ["list": [["a": 1], ["a": 2]]]

d["list"].map { item in
    print("item is \(item)")
}

[["a": 1], ["a": 2]].map { item in
    print("item is \(item)")
}

我希望这些打印出同样的东西,因为d["list"] == [["a": 1], ["a": 2]]。然而,当我运行它时,第一个给了我:

item is [["a": 1], ["a": 2]]

第二个:

item is ["a": 1]


item is ["b": 2]

为什么会这样?

repl link

2 个答案:

答案 0 :(得分:2)

d["list"]返回一个可选项,map函数不是Array.map,而是Optional.map

添加?会有所不同。

d["list"]?.map { item in
    print("item is \(item)")
}

另请注意,在这种情况下,您应该使用forEach而不是map。这会使错误显而易见:

// compilation error "Value of optional type not unwrapped..."
d["list"].forEach { item in
    print("item is \(item)")
}

答案 1 :(得分:0)

这是因为d["list"]返回一个可选项。

你说d["list"] == [["a": 1], ["a": 2]],但事实并非如此。当您尝试代码时

if d["list"] == [["a": 1], ["a": 2]] {
    print("true")
}

此代码无法编译。有一个错误:

  

错误:上下文类型' _OptionalNilComparisonType'不能与数组文字一起使用

您必须使用d["list"]!展开?,它才能正确打印。