Два возврата без условий в Swift - PullRequest
0 голосов
/ 28 февраля 2019

Я видел следующее решение, и я не мог понять, как использовать возврат здесь.

Как эти два возврата отделены друг от друга, где условие?

func majorityElement(_ nums: [Int]) -> [Int] {
    var elems: [Int: Int] = [:]
    for n in nums {
        elems[n] = (elems[n] ?? 0) + 1
    }
    return elems.compactMap { key, value in 
        if value > nums.count / 3 { return key } 
        return nil 
    }
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Чтобы понять этот код, вы должны прочитать о замыканиях и функциях более высокого порядка.

Замыкание - это анонимная функция - блок кода, который не имеет имени.

Функция высшего порядка - это функция, которая принимает замыкание в качестве параметра, и где замыкание определяет, что должна делать эта функция.

Функция Sequence sorted(by:) является примеромфункция более высокого порядка.Он принимает замыкание, которое берет два элемента из последовательности и возвращает true, если первый элемент должен появиться первым в отсортированном выводе, или false в противном случае.

sorted() - это функция общего назначения.Закрытие, которое вы передаете, сравнивает пары объектов и делает все остальное.

compactMap() - еще одна функция более высокого порядка в различных коллекциях.В приведенном выше коде он выполняет compactMap для Dictionary.

Код return elems.compactMap{...} берет словарь elems и передает каждую пару ключ / значение в словаре в ваше замыкание.Если ваше закрытие возвращает nil для данной пары ключ / запись, эта запись удаляется из выходных данных.

Возврат, который вы видите внутри фигурных скобок для compactMap, - это возврат для замыкания.И снова, compactMap вызывает ваше замыкание несколько раз, по одному разу для каждой пары ключ / значение в словаре, и замыкание должно возвращать значение для каждого вызова.

0 голосов
/ 28 февраля 2019

Существует первое возвращение, return elems.compactMap, которое возвращает результат compactMap как результат функции (массив), затем есть два возврата внутри замыкания, которое возвращает результат отображения, то есть то, что добавляется кмассив.

Если значение value больше nums.count / 3, то возвращается key и добавляется в массив, в противном случае возвращается nil, означая, что в массив ничего не добавляется.

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