Свойство Wrapped Value при доступе из других файлов дает необязательный тип
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.
Но это с учетом ошибки Инициализатор для условной привязки должен иметь необязательный тип, а не `` Пользователь '' при использовании в другом файле, как показано ниже.
class ABC {
func sss(){
if let _ = HarkAppPreference.user { // here is gives error
}
}
}
Но если то же самое используется в том же файле, он отлично работает с необязательной цепочкой.
1 ответ
Согласно ответу команды разработчиков Apple на форуме разработчиков, этого не происходит в Xcode 11.3, и он отлично работает, если добавить его в объявленное свойство.