2016-10-16 4 views
2

Что мне нужно, чтобы представить в RealmSwift является следующая схема JSON:RealmSwift + ObjectMapper управления Строка Array (теги)

{ 
    "id": 1234, 
    "title": "some value", 
    "tags": [ "red", "blue", "green" ] 
} 

Его основной массив строк, что я наткнуться на. Я предполагаю, что в Realm Мне нужно, чтобы представить «метки», как

dynamic id: Int = 0 
dynamic title: String = "" 
let tags = List<MyTagObject>() 

решений помечает свою собственную таблицу в Realm, но как сопоставить его с ObjectMapper? Это, как далеко я ...

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

... но линия теги не компилируется, конечно, из Списка и Realm не может использовать [String] типа.

Это похоже на несколько распространенную проблему, и я надеюсь, что кто-то, кто столкнулся с этим, может прокомментировать или указать на сообщение с предложением.

UPDATE 1 MyTagObject выглядит следующим образом:

class MyTagObject: Object { 
    dynamic var name: String = "" 
} 

UPDATE 2 Я нашел этот пост, который имеет дело с объектом царств, но предполагается, что массив назвал элементы, а не простой строки , https://gist.github.com/Jerrot/fe233a94c5427a4ec29b

+0

Как выглядит класс 'MyTagObject'? – ozgur

+0

Я обновил вопрос с классом ozgur – darren

+0

Я не знаю, в чем проблема. tag - это список «MyTagbject», поэтому это должно работать нормально ... –

ответ

1

Это будет работать, если теги массив будет содержит словарь объектов с ключом: «имя»

{ 
    "id": 1234, 
    "title": "some value", 
    "tags": [ ["name" : "red"], ... ] 
} 

Если вы не можете изменить объект JSON, я рекомендую вам карту JSON в области программно.

for tagName in tags { 
    let tagObject = MyTagObject() 
    tagObject.name = tagName 
    myObject.tags.append(tagObject) 
} 
+0

Точно! Формат не может быть изменен, так как я могу его кодировать? Есть ли там пример? – darren

+0

'для tagName теги { let tagObject = MyTagObject() tagObject.name = tagName myObject.tags.append (tagObject) } ' – Omartio

+0

Я предполагаю, что внутри функции сопоставления, но как мне получить« теги »в вашем примере для цикла? – darren

3

Прежде всего, мы должны считать, что наша модель распространяется как Object и Mappable.

Давайте создадим модель обертки для хранения типа примитива (String):

class StringObject: Object { 
    dynamic var value = "" 
} 

Тогда мы описываем соответствующие свойства и правила отображения для корневой модели (не обертка один):

var tags = List<StringObject>() 

var parsedTags: [String] { 
    var result = [String]() 
    for tag in tags { 
     result.append(tag.value) 
    } 
    return result 
} 

override static func ignoredProperties() -> [String] { 
    return ["parsedTags"] 
} 

func mapping(map: Map) { 
    if let unwrappedTags = map.JSON["tags"] as? [String] { 
     for tag in unwrappedTags { 
      let tagObject = StringObject() 
      tagObject.value = tag 
      tags.append(tagObject) 
     } 
    } 
} 

Нам нужна собственность tags, чтобы сохранить и получить информацию о темах из Realm. Тогда свойство parsedTags упрощает извлечение тегов в обычном формате массива. Определение ignoredProperties позволяет избежать некоторых сбоев в работе Realm при экономии данных (из-за этого мы не можем хранить типы данных, отличные от Realm, в Realm). И, наконец, мы вручную анализируем наши теги в функции mapping, чтобы сохранить ее в Царстве.