2015-04-11 1 views
0

Я написал этот код, чтобы изменить файл Plist:Изменение PLIST не работает быстры

var check = false 

    let path = NSBundle.mainBundle().pathForResource("se.feomedia.qkrussia", ofType: "plist") 
    let dict = NSMutableDictionary(contentsOfFile : path!)! 
    for (key, value) in dict { 
     if String(key as NSString).hasPrefix("GAME") { 
      for k in dict.objectForKey(key) as Array<NSDictionary> { 
       for (g, var d) in k { 
        if String(g as NSString) == "index" { 
         check = true 
        } 
        if String(g as NSString).hasPrefix("backup") || (String(g as NSString).hasPrefix("question") && check) { 
         println(g) 
         let u = d as NSDictionary 
         println(2) 
         for (e, var h) in u { 
          if String(e as NSString).hasPrefix("correct") { 
           h = "someText" 
          } 
         } 
         d = u 
        } 
        else { 
         if String(g as NSString) == "correct" { 
          d = "someText" 
         } 
        } 
       } 
       check = false 
      } 
     } 
    } 
    dict.writeToFile("/Users/nik/Desktop/correct.plist", atomically: true) 

PLIST файл содержит следующее:

<dict> 
<key>CURRENT_USER_ID</key> 
<string>6751073888894976</string> 
<key>FBAccessTokenInformationKeyUUID</key> 
<string>2AB33590-09AC-4B76-9E57-42005E9CF9B7</string> 
<key>GAME_4808886523527168</key> 
<array> 
    <dict> 
     <key>cat_id</key> 
     <string>19</string> 
     <key>cat_name</key> 
     <string>Знаменитости и СМИ</string> 
     <key>correct</key> 
     <string>Макс и Эмме</string> 
     <key>q_id</key> 
     <integer>6296760553046016</integer> 
     <key>question</key> 
     <string>Как зовут детей Дженифер Лопез?</string> 
     <key>timestamp</key> 
     <string>2014-07-28 14:18:18</string> 
     <key>wrong1</key> 
     <string>Макс и Эббот</string> 
     <key>wrong2</key> 
     <string>Дженни и Марк</string> 
     <key>wrong3</key> 
     <string>Селена и Джастин</string> 
    </dict> 
    <dict> 
     <key>cat_id</key> 
     <string>19</string> 
     <key>cat_name</key> 
     <string>Знаменитости и СМИ</string> 
     <key>correct</key> 
     <string>2008 г.</string> 
     <key>q_id</key> 
     <integer>4765042876612608</integer> 
     <key>question</key> 
     <string>В каком году Дима Билан победил на Евровидении?</string> 
     <key>timestamp</key> 
     <string>2014-07-28 14:18:18</string> 
     <key>wrong1</key> 
     <string>2006 г.</string> 
     <key>wrong2</key> 
     <string>2007 г.</string> 
     <key>wrong3</key> 
     <string>2010 г.</string> 
    </dict> 
    <dict> 
     <key>cat_id</key> 
     <string>19</string> 
     <key>cat_name</key> 
     <string>Знаменитости и СМИ</string> 
     <key>correct</key> 
     <string>Лампочка</string> 
     <key>q_id</key> 
     <integer>6690225728258048</integer> 
     <key>question</key> 
     <string>Любимый объект художника Васи Ложкина на его собственных картинах?</string> 
     <key>timestamp</key> 
     <string>2015-01-07 12:08:45</string> 
     <key>wrong1</key> 
     <string>Кот</string> 
     <key>wrong2</key> 
     <string>Рамка</string> 
     <key>wrong3</key> 
     <string>Мона Лиза</string> 
    </dict> 

И многое другое. Плис написан правильно, все работает, чтение из plist отлично работает, но файл correct.plist абсолютно такой же, как и в реальном файле, поэтому ничего не изменилось. Я понятия не имею, почему это не работает.

EDIT: Также словари могут содержать 3 элемента: 2 словаря (вопросы и backupQuestion и индекс элемента с целочисленными)

ответ

1

Корень проблемы не в том, что когда вы пишете:

for (g, var d) in k { 

вы больше не работает над словарем путем изменения d. d - новая новая переменная, которую вы затем присваиваете новому значению. Он не изменяет внешнюю переменную, и когда она выходит за пределы области действия в конце цикла for, любые изменения отбрасываются.

Чтобы изменить словарь, лучше всего выбрать элемент, который вы хотите изменить, изменить его, а затем заменить значение в словаре. Что-то вроде этого:

if let path = NSBundle.mainBundle().pathForResource("se.feomedia.qkrussia", ofType: "plist"), 
     dict = NSDictionary(contentsOfFile : path) 
{ 
    for (key, value) in dict { 
     // note, "var items = " creates a COPY of the values 
     if let key = key as? String where key.hasPrefix("GAME"), 
      var items = value as? [NSDictionary] 
     { 
      for idx in indices(items) { 
       //perform some logic on each items[idx] value, 
       // e.g. checking for things with 
       // if items[idx]["index"] != nil, let questionValue = items[idx]["question"] 
       // then updating values in-place, e.g.: 
       // items[idx]["correct"] = "whatever" 
      } 
      // then _replace_ the original value in the dictionary 
      dict.setValue(items, forKey: key) 
     } 
    } 
    dict.writeToFile("/Users/nik/Desktop/correct.plist", atomically: true) 
} 

Обратите внимание, приведенный выше код зависит от особенностей в Swift 1.2, которая в настоящее время выпущен для производства в App Store. Я настоятельно рекомендую обновить его, поскольку у него есть лот функций, облегчающих этот вид кода.

+0

ОК, есть ли способ изменить эти переменные в 'dict'? –

+0

@ НикитинРоман обновил мой ответ с некоторыми предложениями. –

1

Ваш код очень трудно читать. Вы используете однобуквенные переменные с небольшим выразительным значением. Существует много вложенной логики, поэтому ясность будет важна.

Насколько я могу судить, вы проверяете значения, которые не отображаются в вашем образце, например «индекс» или «резервное копирование». Кажется, вы пытаетесь передать строку под вопросом в словарь - не знаете, каков будет эффект этого.

Следует обратить внимание на то, что когда у вас есть постоянный словарь с переменным содержимым или наоборот, а затем начинайте назначать его другому, все может иметь неожиданные результаты.

Мое предложение состоит в том, что вы начинаете с совершенно новой структуры, где все редактируется (т. Е. Объявлено как var), и просто устанавливайте значения из существующих данных в соответствии с вашей бизнес-логикой. Это должно позволить вам писать более читаемый код, и он должен работать как ожидалось.