快速映射高阶函数格式

时间:2019-02-25 05:43:14

标签: swift

我想知道为什么地图格式必须是{( )}而不是{ }

func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] {

    // the following is right
    var num1Reduce = nums1.reduce(0){ $0 + $ 1}

    /// the following is wrong ??
    var num2Dict = Dictionary(nums2.map{ $0, 1 }, uniquingKeysWith : +)

    // the following is right
    var num1Dict = Dictionary(nums1.map{ ($0, 1) }, uniquingKeysWith : +)

}

,甚至看到以下格式的({ })。我完全糊涂了!

let cars = peopleArray.map({ $0.cars })
print(cars)

2 个答案:

答案 0 :(得分:1)

您正在使用以下Dictionary initializer

init<S>(_ keysAndValues: S, uniquingKeysWith combine: (Dictionary<Key, Value>.Value, Dictionary<Key, Value>.Value) throws -> Dictionary<Key, Value>.Value) rethrows where S : Sequence, S.Element == (Key, Value)

请注意,S是一个序列,其元素是键/值对的元组。

nums1.map{ ($0, 1) }传递给第一个参数时,您将从nums1创建一个键/值元组数组。

使用nums2.map{ $0, 1 }时失败,因为它缺少元组的括号。

请记住,nums1.map{ ($0, 1) }nums1.map({ ($0, 1) })的简写。这与trailing closures有关,而here{ }内部出现的元组的括号无关。

答案 1 :(得分:1)

映射是将闭包作为参数的函数。我们可以像调用其他普通函数一样调用地图并传递参数,而无需删除括号(),例如

(0...100).map ({ _ in print("yeti")})

但是swift允许我们删除括号作为一种简写方式,我们可以像这样写,从而消除了()

(0...100).map { _ in print("yeti")}

但是,如果您要访问数组元素的各个值,则可以通过两种方式进行访问,

  1. 给出一个数组,您可以使用$ 0来访问它的单个元素,基本上是说Hey map, give me the first element at this current index
(0...100).map {$0}
  1. 您决定使用一个可读的变量名称来定义要访问的值,而不是使用默认的快速索引。
(0...100).map {element in}

这得到$0并将其分配给element,关键字in基本上告诉编译器,嘿,$0现在是element,我们要在in之后使用它。否则,如果您删除了in关键字,则编译器会说它不知道任何名为element的变量。

对于像字典这样的特殊集合,它们每个索引有两个值,即keyvalue,因此,如果要在映射过程中访问字典的内容,可以在如上两种方式,a)。使用默认的快速索引,或为每个索引提供值,可读的变量名。例如

let dictionary = ["a": 3, "b": 4, "c": 5]
dictionary.map{($0, $1)}

我们使用方括号()使编译器知道我们要映射的集合每个索引有两个值。请注意,内部括号会创建一个元组

dictionary.map {(key, value) in }