JSA986
JSA986

Reputation: 5936

Adding to swift array keeps overwriting last object

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

Answers (2)

Stuart
Stuart

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

rintaro
rintaro

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

Related Questions