I'm using Alamofire, Objectmapper, Realm and everything is working beside one thing: I can't map nested objects.
class Voting: Object, Mappable {
    dynamic var votingID: String = ""
    dynamic var question: String = ""
    var votingOptions = List<VotingOption>()
    required convenience init?(_ map: Map) {
        self.init()
    }
    func mapping(map: Map) {
        votingID <- map["id"]
        question <- map["question"]
        votingOptions <- map["votingOptions"]
    }
    override class func primaryKey() -> String {
        return "votingID"
    }   
}
class VotingOption: Object, Mappable{
    dynamic var optionID: String = ""
    dynamic var text: String = ""
    required convenience init?(_ map: Map) {
        self.init()
    }
    func mapping(map: Map) {
        optionID <- map["id"]
        text <- map["optionText"]
    }
    override class func primaryKey() -> String {
        return "optionID"
    }   
}
The JSON that I'm trying to map is:
{
    "Voting": [
        {
            "question": "Which option do yo prefer?",
            "id": "7f073efd-6f3d-43f2-9fe4-5cad683b77a2",
            "votingOptions": [
                {
                    "optionText": "Option 3",
                    "id": "3bc0a618-8791-4862-a7fd-5f2df464697d"
                },
                {
                    "optionText": "Option 1",
                    "id": "84c6a830-814b-40c8-a252-c074be5d689a"
                },
                {
                    "optionText": "Option 2",
                    "id": "8872ef6f-fc70-445a-802e-d39944006467"
                }
            ]
        }
    ]
}
The mapping funktion in VotingOption never gets called.
The old ListTransform solution no longer works in Swift 3.
This is what I'm using now; put this in a file called, ListExtensions.swift, for example.
import Foundation
import ObjectMapper
import RealmSwift
/// Maps object of Realm's List type
func <- <T: Mappable>(left: List<T>, right: Map)
{
    var array: [T]?
    if right.mappingType == .toJSON {
        array = Array(left)
    }
    array <- right
    if right.mappingType == .fromJSON {
        if let theArray = array {
            left.append(objectsIn: theArray)
        }
    }
}
This allows you to simply use it like this:
class Parent: Object, Mappable {
    dynamic var id: Int = 0
    var children = List<Child>()
    required convenience init?(_ map: Map) {
        self.init()
    }
    func mapping(map: Map) {
        id <- map["id"]
        children <- map["children"]
    }
}
                        The problem you're seeing is due to ObjectMapper having no knowledge of Realm's List type. It is not aware that it is a collection type, and that it must be mutated in place rather than being assigned to. You can see discussion of this, including some suggested workarounds, in ObjectMapper GitHub issue #143.
Note also that any List properties on Object subclasses should be declared with let rather than var.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With