Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding objects to an array using Swift without duplication

Tags:

arrays

ios

swift

I am still getting familiar with Swift, and I am having troubles with adding objects to an array at this moment. Also the array shouldn't have duplicates.

What I have so far -

A function that is called when user does a button click on a prototype cell. I am trying to achieve -

  1. Select button (and indicate with a checkmark that he selected/deselected the item)
  2. For each selected item, I have two values - bool status isActive and the selected item's subscriptionID
  3. When user selects the item, I need to add this selection as an object and further append this to an array.
  4. For that, I have subscriptionUpdateData: NSDictionary and my new empty array subscriptionsArray: [NSDictionary] = []

Full Function

 func subscriptionCell(cell: SubscriptionCell, didToggleSubscription subscription: Subscriptions) {

        var subscriptionsArray: [NSDictionary] = []
        var subscriptionUpdateData: NSDictionary = ["subscriptionID": 0, "isActive": false]

        if let matchingSubscription = subscriptionInformation?.filter({ $0.subscriptionID == subscription.subscriptionID }).first {

            matchingSubscription.isActive = !(matchingSubscription.isActive!)

            let subscriptionStatus = matchingSubscription.isActive
            let subscriptionStatusForId = matchingSubscription.subscriptionID

            subscriptionUpdateData = ["subscriptionID": subscriptionStatusForId!, "isActive": subscriptionStatus!]
            tableView.reloadData()
        }
        subscriptionsArray.append(subscriptionUpdateData)
        print("\(subscriptionsArray)")

    }

What is going on with above - I am able to select an item, form it as a dictionary, and add it to my array. :-) But whenever I select a different item in my list of items, it replaces the existing element in the array with the newly selected item. :-(

I am looking for something like below (without duplicates) which is an input to a REST endpoint -

    [{   "subscriptionID" : 1234, 
        "isActive" : true
    },
    {
        "subscriptionID" : 5678, 
        "isActive" : false
    },
    {
        "subscriptionID" : 3489, 
        "isActive" : true
    }]

Can someone look into where I am missing something? Or whether there is a better way I can do this?

like image 374
Lohith Korupolu Avatar asked Nov 16 '25 11:11

Lohith Korupolu


2 Answers

You must declare subscriptionsArray as global variable, try this code:

    var subscriptionsArray: [NSDictionary] = []
    func subscriptionCell(cell: SubscriptionCell, didToggleSubscription subscription: Subscriptions) {
        var subscriptionUpdateData: NSDictionary = ["subscriptionID": 0, "isActive": false]

        if let matchingSubscription = subscriptionInformation?.filter({ $0.subscriptionID == subscription.subscriptionID }).first {

            matchingSubscription.isActive = !(matchingSubscription.isActive!)

            let subscriptionStatus = matchingSubscription.isActive
            let subscriptionStatusForId = matchingSubscription.subscriptionID

            subscriptionUpdateData = ["subscriptionID": subscriptionStatusForId!, "isActive": subscriptionStatus!]
            tableView.reloadData()
        }
        subscriptionsArray.append(subscriptionUpdateData)
        print("\(subscriptionsArray)")

    }
like image 112
Quoc Le Avatar answered Nov 19 '25 02:11

Quoc Le


You can use swift dictionary to store those unique subscriptions by using their ids as keys:

id1: status1
id2: status2
...

Code sample:

var statusesDict = [Int: Bool?]()

func subscriptionToggled(subscription: Subscription) {
    if let matchingSubscription = subscriptionInformation?.filter({ $0.subscriptionID == subscription.subscriptionID }).first {
        let status = matchingSubscription.isActive
        let id = matchingSubscription.subscriptionID
        statusesDict[id] = status
    }
    //if you're using the same object from dataSource array, you dont need to look for it by filtering, just use the parameter object
}

Now, when you need to send the result to server just create an array from your dictionary:

func getSubscriptionsArray() -> [[String: Any]] {
    var result = [Dictionary<String, Any>]()
    for (id, status) in statusesDict.enumerated() {
        let subscriptionDict: [String: Any] = [
            "subscriptionID" : id,
            "isActive" : status
        ]
        result.append(subscriptionDict)
    }
    print("\(result)")
    return result
}

You should not send dictionary description as it is to server. First you should serialize it to JSON:

 let jsonData = try JSONSerialization.data(withJSONObject: array, options: [])
 let string = String(data: jsonData, encoding: String.Encoding.utf8)

For pretty printed json:

 let jsonData = try JSONSerialization.data(withJSONObject: array, options: JSONSerialization.WritingOptions.prettyPrinted)
 let string = String(data: jsonData, encoding: String.Encoding.utf8)
like image 34
alexburtnik Avatar answered Nov 19 '25 01:11

alexburtnik



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!