不符合协议BindableObject-Xcode 11 Beta 4

Sha*_*DES 17 swiftui xcode11

玩弄那里的例子。找到了一个项目,该项目的类是可绑定的对象,没有给出任何错误。现在Xcode 11 beta 4已经发布,我得到了错误:

类型“ UserSettings”不符合协议“ BindableObject”

它在错误上有一个修复按钮,当您单击它时,它会添加

typealias PublisherType = <#type#>
Run Code Online (Sandbox Code Playgroud)

希望您填写类型。

类型是什么?

class UserSettings: BindableObject {

    let didChange = PassthroughSubject<Void, Never>()

    var score: Int = 0 {
        didSet {
            didChange.send()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

kon*_*iki 59

Beta 4 发行说明说:

BindableObject协议的要求现在是willChange而不是didChange,并且应该在对象更改之前而不是更改之后发送。此更改可以改进更改通知的合并。(51580731)

您需要将代码更改为:

class UserSettings: BindableObject {

    let willChange = PassthroughSubject<Void, Never>()

    var score: Int = 0 {
        willSet {
            willChange.send()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Beta 5中,他们再次更改了它。这次他们一起弃用了BindableObject!

BindableObject替换为Combine框架中的ObservableObject协议。(50800624)

您可以通过定义在对象更改之前发出的objectWillChange发布者来手动遵守ObservableObject。但是,默认情况下,ObservableObject自动合成objectWillChange并在任何@Published属性更改之前发出。

@ObjectBinding替换为@ObservedObject。

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

struct MyView: View {
    @ObservedObject var settings: UserSettings
}
Run Code Online (Sandbox Code Playgroud)

  • —我想知道调用此方法后必须更改多长时间?而且,如果您在调用`willChange`之后从未更改过值,会发生什么? (2认同)

Zgp*_*ace 5

在 Xcode 11.X 中,我验证在 Xcode 11.2.1、11.3 中没问题。

BindableObject 更改为 ObservableObject。

ObjectBinding 现在是 ObservedObject。

didChange 应该更改为 objectWillChange。

List(dataSource.pictures, id: .self) { }
Run Code Online (Sandbox Code Playgroud)

您现在还可以摆脱 did/willChange 发布者和 .send 代码,只制作图片 @Published

其余的将自动为您生成。

例如:

import SwiftUI
import Combine
import Foundation

class RoomStore: ObservableObject {
    @Published var rooms: [Room]
    init(rooms: [Room]) {
        self.rooms = rooms
    }
}

struct ContentView: View {
    @ObservedObject var store = RoomStore(rooms: [])
}
Run Code Online (Sandbox Code Playgroud)

参考:https : //www.reddit.com/r/swift/comments/cu8cqk/getting_the_errors_pictured_below_when_try_to/