swift - 在 swift 5.1 类中使用属​​性包装器时出错

标签 swift swiftui swift5 combine

我在 SwiftUI 中使用 UserDefaults 和合并。

我的 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)
        }
    }
}

在以下类中使用此结构时,如下所示:

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):类“DataStore”没有初始值设定项

(2):通用结构“UserDefault”不能用作属性

我认为 swift 5.1 中有更改或折旧,但我找不到它。

最佳答案

使用这样的东西:

@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

关于swift - 在 swift 5.1 类中使用属​​性包装器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58881050/

相关文章:

ios - Alamofire:发送 JSON 作为请求参数

ios - 无法以编程方式设置单元格容器 BG

swiftui - 带有 SwiftUI : How to change the environment locale on the fly 的 Swift 5

ios - SwiftUI SceneDelegate 问题

swift - 对 Swift [UI] 中的 UserDefaults 感到疯狂

swift - 标准化社交媒体分享方法中的"fatal error: unexpectedly found nil while unwrapping an Optional value"

ios - CollectionView 组合布局中的部分标题 z 索引 - iOS 13

ios - 如何使用 Swift UI 将忽略安全区域的 MapView 与我的其余内容对齐?

ios - SwiftUI 列表未更新内拉以刷新 View

ios - SwiftUI旋转屏幕使模式不再消失