Что никогда не бывает в PassthroughSubject?

Чтобы класс в SwiftUI соответствовал BindableObject, у него должен быть Publisher, обычно didChange, который во всей документации SwiftUI и видеороликах, которые я видел до сих пор, является PassthroughSubject.

Например, если у вас есть класс с именем TestObject, didChange может равняться PassthroughSubject<TestObject, Never>(). Я понимаю, что первый тип — это тип данных, которые передает PassthroughSubject, но что такое Never? Какова его цель и есть ли сценарии, где второй тип не подходит Never?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 082
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Второй тип, предоставляемый PassthroughSubject, используется в случае сбоя.

final class PassthroughSubject<Output, Failure> where Failure : Error

Единственным требованием для этого типа является соответствие Error.

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

Итак, вместо того, чтобы иметь didChange(self), вы передали бы ему ошибку в этом случае?

RPatel99 14.06.2019 19:34

@RPatel99 RPatel99 На самом деле вам нужно отправить завершение «сбой» с желаемой ошибкой: didChange.send(completion: .failure(theError))

rraphael 17.06.2019 10:53

Принятый ответ не касается того, что такое Never и почему мы можем использовать его с PassthroughSubject.

Never определяется как перечисление без регистров. Это означает, что он никогда не может быть построен. Звучит бесполезно. Однако может быть очень полезно убедиться, что функции ведут себя так, как ожидалось.

Например fatalError. fatalError никогда не вернется, потому что это приводит к сбою приложения. Поэтому у вас может возникнуть соблазн объявить это как:

func fatalError() {}

Однако это было бы не правильно. Приведенная выше функция фактически возвращает пустой кортеж (как и все функции, объявленные выше в swift). Для корректности типов мы хотим сообщить компилятору, что если эта функция будет вызвана, она никогда не вернется к тому коду, который ее первоначально вызвал. Поэтому мы можем использовать Never.

Никогда в PassthroughSubject

Иногда нам нужен Subjects, который никогда не будет отправлять ошибки. Заявив:

PassthroughSubject<TestObject, Never>()

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

subject.send(completion: .failure(<Nothing to construct here>))

Например: Допустим, у нас есть таймер, и мы хотим публиковать события каждые 5 секунд. Мы могли бы использовать PassthroughSubject для отправки сообщений подписчикам каждые 5 секунд. Однако мы знаем, что это не может дать сбой, поэтому, чтобы всем потребителям нашего api было ясно, что им не нужно беспокоиться об обработке случая сбоя, мы можем объявить PassthroughSubject с Never как тип Error.

Примечание:

Поток все еще можно прервать, используя следующее:

subject.send(completion: .finished)

Другие вопросы по теме