Неоднозначное использование оператора '‹~' в ReactiveSwift

Я унаследовал несколько старый проект, написанный на ReactiveSwift (v3.1.0) и ReactiveCocoa (v7.2.0). Когда я открыл его в Xcode 10.1, он был построен без проблем. Но когда я сделал то же самое в Xcode 10.3, я получаю сообщение об ошибке Неоднозначное использование оператора '‹~' в следующем блоке кода.

self.newMatchesTitleLabel.reactive.text <~ self.viewModel.newMatchesViewModel.data.producer.map { matches in
    let newMatchesCount = matches.filter({ !$0.hasViewedOnce }).count
    let newMatchesString = matches.count == 1 ? "New Match" : "New Matches"
    return newMatchesCount == 0 ? newMatchesString : "\(newMatchesString) (\(newMatchesCount))"
}

Кажется, из-за всех переменных и вычислений, выполненных внутри замыкания, компилятор почему-то не может вывести тип (?). Когда я комментирую эти части, компилятор затыкается. Но, очевидно, мне нужно, чтобы они работали. Есть ли способ исправить это так, как есть?


Я попытался убрать эти части из замыкания, объявив две переменные уровня класса.

self.newMatchesCount <~ self.viewModel.newMatchesViewModel.data.producer.map { $0.filter({ !$0.hasViewedOnce }).count }
self.newMatchesString <~ self.viewModel.newMatchesViewModel.data.producer.map { $0.count == 1 ? "New Match" : "New Matches" }

Чего я сейчас не могу понять, так это того, как выполнить окончательную логическую проверку и присвоить это значение newMatchesTitleLabel реактивным способом.

Я плохо разбираюсь в ReactiveSwift/ReactiveCocoa, поэтому могу сделать еще хуже. К сожалению, на данный момент не может быть и речи об обновлении всего проекта для использования последних версий. Мне просто нужно, чтобы эта ошибка исчезла.


person Isuru    schedule 19.01.2020    source источник


Ответы (1)


Это не решение, а несколько шагов, которые помогут вам найти исправление.

Компилятор Swift не всегда выдает содержательные сообщения об ошибках, когда задействованы замыкания, во многих случаях даже выдавая совершенно не связанные ошибки. Это происходит в основном с замыканиями, которые явно не объявлены, например. путем полного объявления типов параметров и результата параметра.

В вашем коде я вижу два замыкания, поэтому первым шагом будет добавление к ним объявлений типов.

self.viewModel.newMatchesViewModel.data.producer.map { (matches: TypeForMatches) -> ResultType in

, а также

let newMatchesCount = matches.filter({ (match: MatchType) -> Bool in !$0.hasViewedOnce }).count

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

person Cristik    schedule 19.01.2020
comment
Спасибо за ответ. Пробовал оба, но, к сожалению, все еще получаю одно и то же сообщение об ошибке. - person Isuru; 19.01.2020
comment
@Isuru означает, что проблема в другом, а не в закрытии. Можете ли вы обновить вопрос с определениями, необходимыми для попытки воспроизвести проблему, в основном, как часть producer? Любопытно, что это за штука производит. - person Cristik; 19.01.2020