我想知道为什么地图格式必须是{( )}
而不是{ }
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)
答案 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")}
但是,如果您要访问数组元素的各个值,则可以通过两种方式进行访问,
Hey map, give me the first element at this current index
。(0...100).map {$0}
(0...100).map {element in}
这得到$0
并将其分配给element
,关键字in
基本上告诉编译器,嘿,$0
现在是element
,我们要在in
之后使用它。否则,如果您删除了in
关键字,则编译器会说它不知道任何名为element
的变量。
对于像字典这样的特殊集合,它们每个索引有两个值,即key
和value
,因此,如果要在映射过程中访问字典的内容,可以在如上两种方式,a)。使用默认的快速索引,或为每个索引提供值,可读的变量名。例如
let dictionary = ["a": 3, "b": 4, "c": 5]
dictionary.map{($0, $1)}
我们使用方括号()
使编译器知道我们要映射的集合每个索引有两个值。请注意,内部括号会创建一个元组
dictionary.map {(key, value) in }