-
-
Save Jerrot/fe233a94c5427a4ec29b to your computer and use it in GitHub Desktop.
// Based on Swift 1.2, ObjectMapper 0.15, RealmSwift 0.94.1 | |
// Author: Timo Wälisch <[email protected]> | |
import UIKit | |
import RealmSwift | |
import ObjectMapper | |
import SwiftyJSON | |
class ArrayTransform<T:RealmSwift.Object where T:Mappable> : TransformType { | |
typealias Object = List<T> | |
typealias JSON = Array<AnyObject> | |
let mapper = Mapper<T>() | |
func transformFromJSON(value: AnyObject?) -> List<T>? { | |
var result = List<T>() | |
if let tempArr = value as! Array<AnyObject>? { | |
for entry in tempArr { | |
let mapper = Mapper<T>() | |
let model : T = mapper.map(entry)! | |
result.append(model) | |
} | |
} | |
return result | |
} | |
// transformToJson was replaced with a solution by @zendobk from https://gist.github.com/zendobk/80b16eb74524a1674871 | |
// to avoid confusing future visitors of this gist. Thanks to @marksbren for pointing this out (see comments of this gist) | |
func transformToJSON(value: Object?) -> JSON? { | |
var results = [AnyObject]() | |
if let value = value { | |
for obj in value { | |
let json = mapper.toJSON(obj) | |
results.append(json) | |
} | |
} | |
return results | |
} | |
} |
// SampleModel.swift | |
// Author: Timo Wälisch <[email protected]> | |
import UIKit | |
import ObjectMapper | |
import RealmSwift | |
import SwiftyJSON | |
class SampleModel: Object, Mappable { | |
// MARK: Realm - stored properties | |
dynamic var title: String = "" | |
var products = List<ProductModel>() | |
// MARK: ObjectMapper | |
class func newInstance(map: Map) -> Mappable? { | |
return SampleModel() | |
} | |
/// Mapping between ObjectMapper (JSON) and the model properties | |
func mapping(map: Map) { | |
title <- map["title"] | |
products <- (map["products"], ArrayTransform<ProductModel>()) | |
} | |
} |
Here is the simplified version using swift 3+
func transformToJSON(_ value: Object?) -> JSON? {
var results = [[String:Any]]()
if let value = value {
results.append(contentsOf: value.map({ self.mapper.toJSON($0) }))
}
return results as ArrayTransform.JSON?
}
Very Crazy, if properties is managed in Realm, the correct is used let
for declaration of List and not var
?
Thanks it worked for me But I needed to change it according to Swift warnings and errors and this is what I ended up with:
class ArrayTransform<T:RealmSwift.Object> : TransformType where T:Mappable {
typealias Object = List<T>
typealias JSON = Array<AnyObject>
let mapper = Mapper<T>()
func transformFromJSON(_ value: Any?) -> List<T>? {
let result = List<T>()
if let tempArr = value as! Array<AnyObject>? {
for entry in tempArr {
let mapper = Mapper<T>()
let model : T = mapper.map(JSON: entry as! [String : Any])!
result.append(model)
}
}
return result
}
func transformToJSON(_ value: Object?) -> JSON? {
var results = [AnyObject]()
if let value = value {
for obj in value {
let json = mapper.toJSON(obj)
results.append(json as AnyObject)
}
}
return results
}
}
What if i want to Map my List of Integer or String object? @pendla
I still can't solve it
class X: Object, StaticMappable {
var strings = List<RealmString>()
class func objectForMapping(map: Map) -> BaseMappable? {
return X()
}
func mapping(map: Map) {
strings <- (map["strings"], ListTransform<RealmString>())
}
}
class RealmString: Object, StaticMappable {
dynamic var value = ""
class func objectForMapping(map: Map) -> BaseMappable? {
return RealmString()
}
func mapping(map: Map) {
value <- map
}
}
Json should be like this :
{
x: ["a","b","c"]
}
Thanks for sharing this code!
Here is my solution for Swift 4.0.2 & Xcode 9.2
import RealmSwift
import ObjectMapper
class ArrayTransform<T:RealmSwift.Object> : TransformType where T:Mappable {
typealias Object = List<T>
typealias JSON = Array<AnyObject>
func transformFromJSON(_ value: Any?) -> List<T>? {
let result = List<T>()
if let tempArr = value as! Array<AnyObject>? {
for entry in tempArr {
let mapper = Mapper<T>()
let model : T = mapper.map(JSONObject: entry)!
result.append(model)
}
}
return result
}
func transformToJSON(_ value: List<T>?) -> Array<AnyObject>? {
if (value!.count > 0) {
var result = Array<T>()
for entry in value! {
result.append(entry)
}
return result
}
return nil
}
}
@sudeep23 did you find any solution? i have the same problem.
@calvinsug I have encountered that problem myself. Storing a list of primitive data types in a Realm List apposed to storing a Realm List of Realm Models.
I give a possible solution here: https://stackoverflow.com/a/54581186/1486374
Thanks
I 'm use not optional forced unwrapping
This is my solution for Swift 4.2 & Xcode 10.1
import RealmSwift
import ObjectMapper
class ArrayTransform<T: RealmSwift.Object>: TransformType where T: Mappable {
typealias Object = List<T>
typealias JSON = Array<AnyObject>
/**
- Parameter value: JSON Value
- Returns: if value is `nil` or not Array will be return empty List<T>
*/
func transformFromJSON(_ value: Any?) -> Object? {
let result = Object()
guard let _value = value,
let objectArray = _value as? Array<AnyObject> else { return result }
let mapper = Mapper<T>()
for object in objectArray {
//if model is `nil` continue to next object
guard let model = mapper.map(JSONObject: object) else {
continue
}
result.append(model)
}
return result
}
/**
- Parameter value: RealmSwift Object
- Returns: if value is `nil` or empty will be return empty Array<AnyObject>
*/
func transformToJSON(_ value: Object?) -> JSON? {
var result = JSON()
guard let _value = value, _value.count > 0 else { return result }
result = _value.map { $0 }
return result
}
}
I'm having the same error. Mapping succeeds, but somehow saving the object (with the list of objects) invalidates the list and sets that list to nil.
And from what I've seen, you don't even need the extension for
ArrayTransform
. The latest version ofObjectMapper
successfully maps an array of objects.