Не соответствует протоколу BindableObject - Xcode 11 Beta 4 - программирование
Подтвердить что ты не робот

Не соответствует протоколу BindableObject - Xcode 11 Beta 4

Играя с примерами там. Нашел проект, у которого был класс, который был привязываемым объектом, он не дал никаких ошибок. Теперь, когда Xcode 11 beta 4 вышел, я получаю сообщение об ошибке:

Тип "UserSettings" не соответствует протоколу "BindableObject"

У него есть кнопка исправления ошибки, при нажатии на которую он добавляет

typealias PublisherType = <#type#>

Ожидается, что вы заполните тип.

Каким будет тип?

class UserSettings: BindableObject {

    let didChange = PassthroughSubject<Void, Never>()

    var score: Int = 0 {
        didSet {
            didChange.send()
        }
    }
}
4b9b3361

Ответ 1

Beta 4 В заметках о выпуске говорится:

Требование протоколов BindableObject теперь будет willChange вместо didChange, и теперь должен быть отправлен до изменения объекта чем после того, как это изменится. Это изменение позволяет улучшить объединение изменить уведомления. (51580731)

Вам нужно изменить код на:

class UserSettings: BindableObject {

    let willChange = PassthroughSubject<Void, Never>()

    var score: Int = 0 {
        willSet {
            willChange.send()
        }
    }
}

В бета-версии 5 они снова меняют его. На этот раз они осуждают BindableObject все вместе!

BindableObject заменяется протоколом ObservableObject из Объединить рамки. (50800624)

Вы можете вручную соответствовать ObservableObject, определив objectWillChange издатель, который излучает до изменения объекта. Однако по умолчанию ObservableObject автоматически синтезирует objectWillChange и отправляется до изменения любых свойств @Published.

@ObjectBinding is replaced by @ObservedObject.

class UserSettings: ObservableObject {
    @Published var score: Int = 0
}

struct MyView: View {
    @ObservedObject var settings: UserSettings
}

Ответ 2

Почему отправка уведомления до изменения значения работает? Я сбит с толку. С didChange все было логично и понятно для меня