Используйте Reduce для объединения int из класса - PullRequest
0 голосов
/ 25 апреля 2018

Я посмотрел здесь: Swift 3 - Уменьшить коллекцию объектов с помощью свойства Int , а здесь: https://medium.com/@abhimuralidharan/higher-order-functions-in-swift-filter-map-reduce-flatmap-1837646a63e8, но я не могу заставить работать. Редактировать: Возможно, потому что они изменили способ компиляции кода в Swift 4 (который я использую) https://stackoverflow.com/a/46432554/7715250

Это потому, что я получаю эту ошибку:

Тип контекстного закрытия '(_, Test) -> _' ожидает 2 аргумента, но 1 использовался в теле закрытия

Это мой класс:

class Test {
    let amountLeftToDownload: Int
    let amountDownloaded: Int

    init(amountLeftToDownload: Int, amountDownloaded: Int) {
        self.amountLeftToDownload = amountLeftToDownload
        self.amountDownloaded = amountDownloaded
    }
}

У меня есть массив (прогресс). Я хочу получить общее количество загрузок, которое составляет amountLeftToDownload + amountDownloaded для каждого экземпляра теста. Я попробовал это:

let totalDownloadsToProcess = progress.reduce(0) {$0.amountLeftToDownload, $0.amountDownloaded }

Я заменяю запятую на + и некоторые другие вещи, но она не будет работать.

1 Ответ

0 голосов
/ 25 апреля 2018

Закрытие, переданное reduce, принимает 2 аргумента: первый - это аккумулятор, а второй - элемент из массива, который вы уменьшаете.Таким образом, вам нужно добавить значения из текущей записи к текущему итогу:

let totalDownloadsToProcess = progress.reduce(0) { $0 + $1.amountLeftToDownload + $1.amountDownloaded }

Это может быть понятнее, если вы назовете входные данные:

let totalDownloadsToProcess = progress.reduce(0) { totalSoFar, elem in totalSoFar + elem.amountLeftToDownload + elem.amountDownloaded }

Закрытие вызывается для каждогоэлемент в массиве.На каждом шаге он возвращает новое значение, которое передается как totalSoFar при обработке следующего элемента.0 используется в качестве начального значения для totalSoFar при обработке первого элемента.

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