2016-06-30 8 views
7

Realmオブジェクトモデルには、「イベント」というオブジェクトがあります。各イベントには、EventLocatonsのリストがあります。これらのオブジェクトをjsonからマップしようとしていますが、EventLocationsのリストは常に空です。 オブジェクトは、(明確にするために簡略化)のようになります。SwiftでMappableプロトコルを使用してカスタムオブジェクトの領域リストをマップする方法

class Event: Object, Mappable { 
    override class func primaryKey() -> String? { 
     return "id" 
    } 

    dynamic var id = "" 
    var eventLocations:List<EventLocation> = List<EventLocation>() 

    func mapping(map: Map) { 
     id <- map["id"] 
     eventLocations <- map["eventLocations"] 
    } 
} 

class EventLocation: Object, Mappable { 
    override class func primaryKey() -> String? { 
     return "id" 
    } 

    dynamic var id: String = "" 
    dynamic var name: String = "" 

    required convenience init?(_ map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
     id <- map["id"] 
     name <- map["name"] 
    } 
} 

JSONは、私が持っていることをイベントオブジェクトの配列です。それはAlamofire応答から来て、私はそのようにそれをマップ:

var events = Mapper<Event>().mapArray(json!) 

JSONは次のようになります。

[ 
    { 
    "id" : "21dedd6d", 
    "eventLocations" : [ 
     { 
     "name" : "hh", 
     "id" : "e18df48a", 
     }, 
     { 
     "name" : "tt", 
     "fileId" : "be6116e", 
     } 
    ] 
    }, 
    { 
    "id" : "e694c885", 
    "eventLocations" : [ 
     { 
     "name" : "hh", 
     "id" : "e18df48a", 
     }, 
     { 
     "name" : "tt", 
     "fileId" : "be6116e", 
     } 
    ] 
    } 
] 

誰もが、私はマッピング可能なプロトコルを使用して、カスタムオブジェクトのリストをマッピングする方法を知っています。 Whayは常に "eventLocations"リストが空ですか?

答えて

8

one of the Issues page on ObjectMapper's GitHub repoを見ると、Realm Listのオブジェクトはまだ適切にサポートされているようには見えません。

その問題も、それは私がここにミラーリングよこれ、当分の間、動作するように取得するための潜在的な回避策を示しています

class MyObject: Object, Mappable { 
    let tags = List<Tag>() 

    required convenience init?(_ map: Map) { self.init() } 

    func mapping(map: Map) { 
     var tags: [Tag]? 
     tags <- map["tags"] 
     if let tags = tags { 
      for tag in tags { 
       self.tags.append(tag) 
      } 
     } 
    } 
} 
+0

これは最高のソリューションです、管理された領域の仕事は、タイプvarの宣言されたリストは、常にletを使用することはできません!ありがとう! –

2

別の解決策は、カスタムObjectMapperに対する変換を実装することであろう。 実装hereが見つかります。

次に、あなたのコード内で:

eventLocations <- (map["eventLocations"], ListTransform<EventLocation>()) 
1

あなたは、このための演算子を追加することができます。

スウィフト3実装:

import Foundation 
import RealmSwift 
import ObjectMapper 

infix operator <- 

/// Object of Realm's List type 
public 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) 
     } 
    } 
} 

今、あなたは追加のコードや変換は必要ありません。

list <- map["name"]

私はその要旨を作成しました。してください、確認してくださいhttps://gist.github.com/danilValeev/ef29630b61eed510ca135034c444a98a

関連する問題