Преобразование темы / издателя в другого издателя - PullRequest
0 голосов
/ 01 августа 2020

Для существующего экземпляра CurrentValueSubject цель состоит в том, чтобы создать новый Publisher, который будет принимать поток строк субъекта и, в свою очередь, выводить Ints.

Мой подход заключается в отображении объекта to AnyPublisher:

let subject: CurrentValueSubject<String, Never> = ...

func intPublisher() -> AnyPublisher<Int, Never>
{
    return subject.map { string in
        let value = Int(string) ?? 0
        return AnyPublisher<Int, Never>(value) // Error: Generic parameter P could not be inferred.
    }
}

Однако я не могу создать новый AnyPublisher таким образом. Ясно, что мое понимание издателей ошибочно. Может ли кто-нибудь просветить меня?

1 Ответ

2 голосов
/ 01 августа 2020

Вы просто немного не в порядке.

.map сопоставляет значения, поэтому вам нужно вернуть новое значение, а не нового издателя. Затем используйте .eraseToAnyPublisher, чтобы создать AnyPublisher publisher:

func intPublisher() -> AnyPublisher<Int, Never> {
   subject.map { Int($0) ?? 0 }
          .eraseToAnyPublisher()
}

Вы также можете использовать AnyPublisher(subject.map { Int($0) ?? 0 }) (параметр init - это издатель, а не значение).

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

subject.flatMap { string in
      Just( Int(string) ?? 0 )
   }.eraseToAnyPublisher()

...