Comment puis-je déclarer un tableau d'entiers dans RLMObject
?
Comme :
dynamic var key:[Int]?
Donne l'erreur suivante:
Terminating app due to uncaught exception 'RLMException', reason: ''NSArray' is not supported as an RLMObject property. All properties must be primitives, NSString, NSDate, NSData, RLMArray, or subclasses of RLMObject. See https://realm.io/docs/objc/latest/api/Classes/RLMObject.html for more information.'
Malheureusement, les listes de primitives ne sont pas encore prises en charge. Il y a un problème # 112 pour suivre l'ajout du support pour cela. Vous y trouverez quelques idées sur la façon de contourner cela actuellement.
La solution de contournement la plus simple consiste à créer un objet pour contenir des valeurs int. Ensuite, le modèle pour avoir une liste de l'objet.
class Foo: Object {
let integerList = List<IntObject>() // Workaround
}
class IntObject: Object {
dynamic var value = 0
}
L'offre acceptée est très coûteuse en terme de mémoire. Vous pourriez obtenir une liste de très gros "n" objets.
Ce n'est pas une question de bien et de mal, mais je pense qu'il est bon d'écrire ici une solution de contournement différente.
Une autre approche:
J'ai décidé d'utiliser une seule chaîne pour représenter un tableau Int.
Dans ma classe Realm, j'ai défini une variable:
dynamic var arrInt: String? = nil
Et utilisez-le très facilement:
let arrToSave = [0, 1, 33, 12232, 394]
<MY_CUSTOM_REALM_CLASS>.arrInt = arrToSave.map { String(describing: $0) }.joined(separator: ",")
Et le chemin du retour:
let strFetched = <MY_CUSTOM_REALM_CLASS>.arrInt
let intArray = strFetched.components(separatedBy: ",").flatMap { Int($0) }
Je serai heureux d'entendre vos commentaires, car je pense que cette approche est meilleure.
Heureusement, les tableaux de types primitifs sont désormais pris en charge dans Realm 3.0 et supérieur. (31 octobre 2017)
Vous pouvez désormais stocker des types primitifs ou leurs homologues annulables (plus précisément: booléens, types de nombres entiers et à virgule flottante, chaînes, dates et données) directement dans les tableaux ou listes RLMArrays. Si vous souhaitez définir une liste de ces valeurs primitives, vous n'avez plus besoin de définir des objets encapsuleurs à champ unique encombrants. Au lieu de cela, vous pouvez simplement stocker les valeurs primitives elles-mêmes!
class MyObject : Object {
@objc dynamic var myString: String = ""
let myIntArray = List<Int>()
}
Comme l'indique le message d'erreur, vous devez utiliser RLMArray
- ou plutôt c'est Swift équivalent List
.
Voir: Realm docs