在 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