Essayez cette syntaxe:
lazy var userDataDict: [String : String] = {
defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]()
}()
Cependant, cela ne userDataDict
mis une fois (la première fois, il est accessible), et vous ne verrez aucun changement/mises à jour effectuées à UserDefaults.standard
après ça.
Je vous recommande d'utiliser une calculée propriété à la place:
var userDataDict: [String : String] {
guard let dict = defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else {
return [:]
}
return dict
}
(ce n'est pas une opération coûteuse à faire paresseusement une seule fois, de toute façon)
En outre, je ne vois pas le point d'avoir une copie de UserDefaults.standard
en tant que propriété de votre objet; peut-être il est juste préférable d'avoir:
// remove:
// let defaults = UserDefaults.standard
var userDataDict: [String : String] {
guard let dict = UserDefaults.standard.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else {
return [:]
}
return dict
}
En dernier temark, tous ces amkes votre dictionnaire « lecture seule » dans la mesure où la base de données des paramètres par défaut de l'utilisateur concerné; si vous souhaitez conserver les modifications, votre propriété a besoin d'un setter aussi:
var userDataDict: [String : String] {
get {
guard let dict = UserDefaults.standard.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else {
return [:]
}
return dict
}
set (newValue) {
UserDefaults.standard.set(newValue, forKey: "UserDataDict")
UserDefaults.standard.synchronize()
}
}
Vous avez besoin d'une annotation de type explicite dans Swift 3: https://stackoverflow.com/questions/38118429/swift-lazy-instantiating -using-self. Cela a été corrigé dans Swift 4. –
Vous ne pouvez pas définir une propriété d'instance dans la méthode statique setMobileNumber. –