如果从其他文件访问时,属性包装的值将给出非可选类型

问题描述 投票:0回答:1
struct HarkAppPreference {

    @UserPreferenceField(key: .userSelectedTags)
    static var userSelectedTags: [MLQTag]

    @UserPreferenceField(key: .userLastActivePlalist)
    static var userLastActivePlaylist: [PlayableEntity]

    @UserPreferenceField(key: .userLastActivePlayableEntityMeta)
    static var userLastActivePlayableEntityMeta: LastPlayableEntityMeta

    @UserPreferenceField(key: .currentUSer)
    static var user: User

}

enum UserPreferenceFieldKey : String {

    case userSelectedTags = "MLQUserSelectedTags"
    case userLastActivePlalist = "MLQUserLastActivePlalist"
    case userLastActivePlayableEntityMeta = "MLQUserLastActivePlayableEntityMeta"
    case currentUSer

}

struct User : Codable {
    let name : String
    let phone: String
}

@propertyWrapper
struct UserPreferenceField<T : Codable> {
    let key: UserPreferenceFieldKey
    var wrappedValue : T? {
        get {
            guard let decodedData = UserDefaults.standard.value(forKey: key.rawValue) as? Data else { return nil }
            return try? JSONDecoder().decode(T.self, from: decodedData)

        }
        set {
            do {
                let encodedValue = try JSONEncoder().encode(newValue)
                 UserDefaults.standard.set(encodedValue, forKey: key.rawValue)
            } catch {
                 print("Error in saving codable value - \(error.localizedDescription)")
            }
        }
    }

    init(key:UserPreferenceFieldKey) {
        self.key = key

    }
}

这是我创建的PropertyWrapper,用于将数据保存到UserDefault,如果我在编写PropertyWrapper代码的文件中使用此值,则可以将其与可选链一起使用,符合我的期望。

但是这给出了错误用于条件绑定的初始化程序必须具有可选类型,而不是'User'在如下所示的另一个文件中使用

class ABC {

    func sss(){
        if let _ = HarkAppPreference.user { // here is gives error

        }
    }

}

但是如果在同一文件中使用相同的文件,则可以通过可选的链接很好地工作。

swift5.1 property-wrapper
1个回答
0
投票
根据开发人员论坛上Apple Developers Team的回复,在Xcode 11.3中没有发生,并且在声明的属性中添加了可选属性后,它可以正常工作。
© www.soinside.com 2019 - 2024. All rights reserved.