【问题标题】:map high order function format in swift快速映射高阶函数格式
【发布时间】:2019-02-25 05:43:13
【问题描述】:

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

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)

【问题讨论】:

  • ( ) 正在创建一个元组。请参阅您正在使用的 Dictionary 初始化程序的文档。
  • @rmaddy,有什么有用的网址作为参考吗?
  • 我在this answer 中解释了闭包的每个语法糖(除了捕获表达式)。它一步一步地从冗长到 Swifty。值得一看!

标签: swift


【解决方案1】:

您正在使用以下Dictionaryinitializer

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 相关,与{ } 中出现的元组的括号无关。

【讨论】:

    【解决方案2】:

    map 是一个以闭包为参数的函数。我们可以像调用任何其他普通函数一样调用映射并传递参数,而无需删除括号()e.g

    (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并将其分配给elementin关键字基本上告诉编译器嘿,$0现在是element,我们将在in之后使用它。否则,如果您删除 in 关键字,编译器会说它不知道任何名为 element 的变量。

    对于像字典这样的特殊集合,它们每个索引有两个值,即keyvalue,因此如果您想在映射期间访问字典的内容,可以通过上述两种方式进行, 一个)。使用默认的 swift 索引,或者为每个索引提供值,可读的变量名称。例如

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

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

    dictionary.map {(key, value) in }
    

    【讨论】:

    • 您确实应该说明(接近答案的结尾)内括号 ( ) 正在创建一个元组。
    • 谢谢@rmaddy。让我补充一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多