Reputation: 5936
I want to continually add values to a global/constant array. The problem is it just keeps overwriting the last value rather than adding it to the the array so I always end up with 2 values
Global array
struct Globals {
struct savedCalculationData {
static var dataArray = ["something here"]
}
}
Saved to array in another class
//code to copy string value...
//Add to global array
var copiedDataArray = Globals.savedCalculationData.dataArray
copiedDataArray.append ("\(copyText)") <--- string value
//Save array to defaults
NSUserDefaults.standardUserDefaults().setObject(copiedDataArray, forKey: "savedDataArray")
NSUserDefaults.standardUserDefaults().synchronize()
Upvotes: 3
Views: 1212
Reputation: 37043
You're appending to a copy of the global array, but don't appear to ever set that updated array back, so the global array is not changing.
Assuming you want keep the global data saved whenever you append to it, I would recommend designing your Globals
struct to take care of this automatically:
struct Globals {
// Convenience variable for the standard defaults
private static var Defaults: NSUserDefaults { return NSUserDefaults.standardUserDefaults() }
struct SavedCalculationData {
private static let DataArrayKey = "savedDataArray"
static var dataArray: [String] {
get {
return Defaults.objectForKey(DataArrayKey) as? [String] ?? []
}
set {
// This setter is called when the array contents change,
// not just when a new array is set
Defaults.setObject(newValue, forKey: DataArrayKey)
Defaults.synchronize()
}
}
}
}
Then you can update the global data more succinctly:
Globals.SavedCalculationData.dataArray.append(copyText)
Upvotes: 1
Reputation: 51911
Since Array
is copied when it's assigned to new variables, you are not modifying Globals.savedCalculationData.dataArray
at all.
You should append
without copying:
Globals.savedCalculationData.dataArray.append("\(copyText)")
NSUserDefaults.standardUserDefaults().setObject(Globals.savedCalculationData.dataArray, forKey: "savedDataArray")
or write back copiedDataArray
to Globals.savedCalculationData.dataArray
var copiedDataArray = Globals.savedCalculationData.dataArray
copiedDataArray.append ("\(copyText)")
Globals.savedCalculationData.dataArray = copiedDataArray
NSUserDefaults.standardUserDefaults().setObject(copiedDataArray, forKey: "savedDataArray")
Upvotes: 1