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





Второй тип, предоставляемый PassthroughSubject, используется в случае сбоя.
final class PassthroughSubject<Output, Failure> where Failure : Error
Единственным требованием для этого типа является соответствие Error.
Вы можете использовать тип ошибки, когда способ получения данных может вызвать ошибку, например, сетевую ошибку.
@RPatel99 RPatel99 На самом деле вам нужно отправить завершение «сбой» с желаемой ошибкой: didChange.send(completion: .failure(theError))
Принятый ответ не касается того, что такое 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)
Итак, вместо того, чтобы иметь
didChange(self), вы передали бы ему ошибку в этом случае?