Неоднозначное использование оператора '<~' в ReactiveSwift - PullRequest
0 голосов
/ 19 января 2020

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

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, поэтому, возможно, мне будет хуже , А обновление всего проекта для использования последних версий, к сожалению, пока не обсуждается. Мне просто нужна эта ошибка, чтобы go прочь.

1 Ответ

0 голосов
/ 19 января 2020

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

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

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

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

и

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

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

...