【发布时间】:2019-09-29 20:51:37
【问题描述】:
我正在尝试利用 SwiftUI 和 Combine 来存储我的应用程序的用户默认值。查看其他一些帖子中的建议,我已经更新了我的代码,如下所示。但是,我现在收到“在 'Subject' 上引用实例方法 'send()' 需要类型 'Setup' 和 'Void' 等效”的错误。有人建议我在 PassthroughSubject 中将“Setup”更改为 void,但是这会在启动时在应用程序中造成严重崩溃 - “致命错误:找不到 Setup.Type 类型的可观察对象。”
我有点茫然...欢迎任何指点。
============== DataStoreClass ============
import SwiftUI
import Foundation
import Combine
class Setup: ObservableObject {
private var notificationSubscription: AnyCancellable?
let objectWillChange = PassthroughSubject<Setup,Never>()
@UserDefault(key: "keyValueBool", defaultValue: false)
var somevalueBool: Bool {
didSet{
objectWillChange.send() // <====== Referencing instance method 'send()' on 'Subject' requires the types 'Setup' and 'Void' be equivalent
}
}
init() {
notificationSubscription = NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification).sink { _ in
self.objectWillChange.send()
}
}
}
============= property wrapper ===========
import Foundation
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
var wrappedValue: T {
get {
UserDefaults(suiteName: "group.com.my.app")!.value(forKey: key) as? T ?? defaultValue
} set {
UserDefaults(suiteName: "group.com.my.app")!.set(newValue, forKey: key)
}
}
}
【问题讨论】:
-
我不是最好的组合编码器,但根据您对
<Setup,Never>的定义,您告诉编译器在您的send中您将传递一个Setup实例,如 - I想想 - ``objectWillChange.send([在此处插入您的设置实例])`。我只是没有在你的代码中看到这个“设置实例”到底是什么。