-
-
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>()) | |
} | |
} |
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
}
}
Here is the simplified version using swift 3+