2016-03-13 4 views
1

Есть ли способ сохранить несколько значений для одного и того же ключа в NSUserDefaults? Кажется, я сохраняю только последнее значение, хотя у меня есть несколько значений для клавиши «День».Сохранение нескольких значений в ключе NSUserDefaults

Day:

for days in results! { 
    let nD = DayClass() 
    nD.dayOfTheWeek = days[“D”] as! String 
    let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setObject(nD.dayOfTheWeek, forKey: “Day”) 
} 

Я попытался создать массив в качестве возможного решения, но я все еще получаю только последнее значение при входе его в моей консоли:

var emptyArray = [String]() 
emptyArray.append(dayOfTheWeek) 
print("Array: \(emptyArray)") 
print("ArrayCount: \(emptyArray.count)") 
+1

Вы сохраняете значение на одной и той же клавише. Вы должны использовать разные ключи или массив. Попробуйте изменить слово «День» на другое слово в каждый день –

+0

Я использую API для вытягивания значений, поэтому я не думаю, что могу изменить слово «День» на другое слово в каждый день с тех пор, как дни недели все приходят в результате под тем же ключом от API, который вы знаете? – victorpulak

+0

Тогда я бы использовал массив и сохранил этот массив с ключом «День». Вы можете редактировать этот массив каждый раз, когда вы загружаете его из пользовательских значений по умолчанию, а затем сохраняете его снова. – marc14

ответ

1

Вы можете это сделать. Сначала проверьте, есть ли в преферах уже массив Day. Если это так, добавьте новый dayOfTheWeek в этот массив и сохраните его. Else создайте новый и сохраните его.

for days in results! { 
    let dayOfTheWeek = days["D"] as! String 
    //check if there is already an existing Day array in prefs 
    if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("Day") as? [String] { 
     //if so append the new value to that array and store it 
     if existingArr.contains(dayOfTheWeek) == false { 
      existingArr.append(dayOfTheWeek) 
      let defaults = NSUserDefaults.standardUserDefaults() 
      defaults.setObject(existingArr, forKey: "Day") 
      defaults.synchronize() 
     } 
    } else { 
     //create a new array and store it 
     let defaults = NSUserDefaults.standardUserDefaults() 
     defaults.setObject([dayOfTheWeek], forKey: "Day") 
     defaults.synchronize() 
    } 
} 
+0

Хорошо, дайте мне попробовать! – victorpulak

+0

Единственная проблема заключается в том, что он продолжает сохранять один и тот же материал снова и снова. Поэтому каждый раз, когда я снова останавливаюсь и запускаю приложение, он сохраняет сохраненные мной дни. Поэтому я понедельник несколько раз сохранял в массиве и т. Д. Есть ли способ, чтобы он этого не делал? – victorpulak

+0

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

0
var food: [String] 
          { 


    get { 

     if let returnValue = 
NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] { 
      return returnValue 
     } else { 
      return ["muesli", "banana"] //Default value 
     } 
    } 
    set { 
     NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food") 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    print(food) // prints: ["muesli", "banana"] (at first launch) 

    food = ["cake"] 
    print(food) // prints: ["cake"] 

    food += ["spaghetti"] 
    print(food) // prints: ["cake", "spaghetti"] 

    food = [] 
    print(food) // prints: [] 

    NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food") 
    print(food) // prints: ["muesli", "banana"] 
} 
+0

Я бы порекомендовал добавить ленивую варварскую еду, тогда она будет выполняться только при ее вызове. Также вам не нужно явно вызывать синхронизацию. –

+0

Не уверен, что я понимаю, что вы здесь делаете в связи с моим кодом, можете ли вы объяснить немного больше, если у вас есть шанс? Благодаря! – victorpulak

0
let daysArray = ["Sat", "Sun", "Mon", "Tu", "Wed", "Th", "Fri"] 
// Set Array Into NSUserDefaults 
NSUserDefaults().setObject(daysArray, forKey: "day") 

// Retrive Array from NSUserDefaults 
if let daysOfWeek = NSUserDefaults().arrayForKey("day") as? [String] { 
    for item in daysOfWeek { 
    print(item) 
    } 
} 
+0

Я получаю дни недели от API, поэтому я не могу их жестко закодировать в 'daysArray'. Имеет ли это смысл? Как бы я настроил 'daysArray' в этом случае? – victorpulak

+0

После получения массива данных из вашего API затем сохраните массив в NSUserDefaults. Вам не нужно делать точные, что я сделал. Я только что показал вам, как сохранять данные и сохранять их снова из NSUserDefaults. – iMuzahid

+0

Да, я пытаюсь сохранить их в массив, как мой код показывает в моем вопросе в конце, но он продолжает записывать значения, поэтому я имею только одно значение в массиве, вы знаете? – victorpulak