在 class swift 5.1 中使用 属性 包装器时出错
Error Using property Wrapper in class swift 5.1
我在 SwiftUI 中使用 UserDefaults 和 Combine。
我的 UserDefault.swift 文件:
import SwiftUI
struct UserDefault<T> {
let key: String
let defaultValue:T
var wrappedValue:T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
} set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
在下面class中使用这个结构时如下:
DataStore.swift 文件:
import SwiftUI
import Combine
final class DataStore : ObservableObject { //(1)
let didChange = PassthroughSubject<DataStore, Never>()
@UserDefault(key: "firstLaunch", defaultValue: true) //(2)
var firstLaunch:Bool{
didSet{
didChange.send(self)
}
}
}
在上面的代码中,我遇到了 2 个错误:
(1):Class 'DataStore' 没有初始化器
(2):通用结构'UserDefault'不能用作属性
我认为 swift 5.1 有变化或贬值,但我找不到。
您需要将 @propertyWrapper
注释添加到您的 UserDefault
结构。
@propertyWrapper
struct UserDefault<T> {
...
使用这样的东西:
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md
我在 SwiftUI 中使用 UserDefaults 和 Combine。
我的 UserDefault.swift 文件:
import SwiftUI
struct UserDefault<T> {
let key: String
let defaultValue:T
var wrappedValue:T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
} set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
在下面class中使用这个结构时如下:
DataStore.swift 文件:
import SwiftUI
import Combine
final class DataStore : ObservableObject { //(1)
let didChange = PassthroughSubject<DataStore, Never>()
@UserDefault(key: "firstLaunch", defaultValue: true) //(2)
var firstLaunch:Bool{
didSet{
didChange.send(self)
}
}
}
在上面的代码中,我遇到了 2 个错误:
(1):Class 'DataStore' 没有初始化器
(2):通用结构'UserDefault'不能用作属性
我认为 swift 5.1 有变化或贬值,但我找不到。
您需要将 @propertyWrapper
注释添加到您的 UserDefault
结构。
@propertyWrapper
struct UserDefault<T> {
...
使用这样的东西:
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md