Enregistrer struct dans la classe de NSUserDefaults l'utilisation de Swift
J'ai une classe et à l'intérieur de la classe est un (swift) de tableau, basé sur une struct global.
Je veux enregistrer un tableau avec cette classe de NSUserDefaults. C'est mon code:
struct mystruct {
var start : NSDate = NSDate()
var stop : NSDate = NSDate()
}
class MyClass : NSObject {
var mystructs : [mystruct]
init(mystructs : [mystruct]) {
self.mystructs = mystructs
super.init()
}
func encodeWithCoder(encoder: NSCoder) {
//let val = mystructs.map { $0 as NSObject } //this also doesn't work
let objctvtmrec = NSMutableArray(mystructs) //gives error
encoder.encodeObject(objctvtmrec)
//first approach:
encoder.encodeObject(mystructs) //error: [mystructs] doesn't conform to protocol 'anyobject'
}
}
var records : [MyClass] {
get {
var returnValue : [MyClass]? = NSUserDefaults.standardUserDefaults().objectForKey("records") as? [MyClass]
if returnValue == nil
{
returnValue = []
}
return returnValue!
}
set (newValue) {
let val = newValue.map { $0 as AnyObject }
NSUserDefaults.standardUserDefaults().setObject(val, forKey: "records")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
Je l'ai déjà sous-classé à NSObject, et je sais que j'ai besoin NSCoding. Mais je ne trouve aucun moyen de convertir la structure d'une matrice à une NSMuteableArray ou quelque chose de similaire, je peux stocker. La seule idée jusqu'à maintenant est d'aller à travers chaque entrée et les copier directement sur un nouveau tableau ou d'utiliser beaucoup de ou code objective-c à travers tout le projet, donc je n'ai jamais besoin de les convertir à partir de swift tableaux à objective-c des tableaux. Les deux sont des choses que je ne veux pas faire.
OriginalL'auteur Thomas | 2014-08-28
Vous devez vous connecter pour publier un commentaire.
Swift les structures ne sont pas des classes, donc ils ne sont pas conformes à
AnyObject
protocole. Vous devez repenser votre approche. Voici quelques suggestions:Convertir votre
struct
àfinal class
pour faire respecter l'immuabilitéCarte dans un tableau les dictionnaires de type
[String: NSDate]
let structDicts = mystructs.map { ["start": $0.start, "stop": $0.stop] }
-> erreur fatale: NSArray élément ne correspond à la Swift type d'Élément de TableauOriginalL'auteur akashivskyy
NSUserDefaults
est limitée dans les types qu'il peut gérer:NSData
,NSString
,NSNumber
,NSDate
,NSArray
,NSDictionary
, etBool
. Ainsi pas Swift objets ou des structures peut être sauvé. Autre chose doit être convertie en uneNSData
objet.NSUserDefaults
ne fonctionne pas de la même façon queNSArchiver
. Puisque vous avez déjà ajoutéNSCoder
à vos classes votre meilleur choix pourrait être de sauvegarder et de restaurer avecNSArchiver
d'un fichier dans leDocuments
répertoire..À partir de l'Apple
NSUserDefaults
Docs:OriginalL'auteur zaph
J'ai développé une petite bibliothèque qui peuvent aider. Vous pouvez l'utiliser comme un remplacement de
NSCoding
rapide des structures.Vous auriez besoin de mettre en œuvre un
Koting
protocole pourmystruct
:Puisque vous pouvez facilement convertir la structure de
Data
et de retour:Enfin, c'est ce que vous faites pour mettre en œuvre
NSCoding
:C'est à peu près le même code que vous écrirez si
NSCoding
pris en charge Swift structures.OriginalL'auteur Artem Stepanenko
Je l'utiliser dans mon projet lors de l'encodage avec Swift 4:
let jsonData = """ {"variable1":1234,"variable2":"someString"}"""
struct MyStruct:Codable{
var variable1 :Int
var variable2:String
}
pour récupérer des données de UserDefaults
OriginalL'auteur Bilal Şimşek