сопоставить формат функции высокого порядка в swift - PullRequest
0 голосов
/ 25 февраля 2019

Мне интересно, почему формат карты должен быть {( )}, а не просто { }

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 голосов
/ 25 февраля 2019

Карта - это функция, которая принимает замыкание в качестве параметра.Мы можем вызвать карту и передать параметр, как мы делаем для любого другого обычного вызова функции, не снимая скобок () например

(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}
Вместо того, чтобы использовать быструю индексацию по умолчанию, вы решаете определить значение, к которому вы обращаетесь, присваивая ему читаемое имя переменной, например,
(0...100).map {element in}

Это получает $0 и присваивает его element, ключевое слово in в основном говорит компилятору, что эй, $0 теперь element, и мы собираемся использовать его после in.В противном случае, если вы удалите ключевое слово in, компилятор скажет, что не знает ни одной переменной с именем element.

. Для специальных коллекций, таких как словари, у них есть два значения для индекса, то есть key иvalue, поэтому, если вы хотите получить доступ к содержимому словаря во время отображения, вы можете сделать это двумя способами, как указано выше, а).используйте быстрые индексы по умолчанию или присвойте значения на индекс читаемым именам переменных.Например,

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

Мы используем внутренние скобки (), чтобы дать компилятору понять, что у отображаемой коллекции есть два значения на индекс.Обратите внимание, что внутренняя скобка создает кортеж

dictionary.map {(key, value) in }
0 голосов
/ 25 февраля 2019

Вы используете следующий Dictionary инициализатор :

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) }).Это все относится к трейлинг-замыканиям , которые не имеют ничего общего с круглыми скобками для кортежа, который появляется внутри { }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...