2017-08-24 1 views
0

D'autres questions SO signalent d'utiliser lazy avant la variable, mais cela ne semble pas fonctionner dans ce cas.Impossible d'utiliser le membre d'instance dans l'initialiseur de propriétés, la définition de la variable sur paresseuse ne fonctionne pas

Je reçois encore cette erreur,

Ne peut pas utiliser membre exemple defaults dans la propriété initialiseur; initialiseurs propriété d'exécution avant « moi » est disponible

Où suis-je de se tromper?

class UserData{ 

    let defaults  = UserDefaults.standard 
    lazy var userDataDict = defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() 


    static func setMobileNumber(mobileNumber: String){ 

     userDataDict["mobileNumber"]   = mobileNumber 

    } 
} 
+1

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. –

+1

Vous ne pouvez pas définir une propriété d'instance dans la méthode statique setMobileNumber. –

Répondre

0

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() 
    } 
}