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 -
isActive and the selected item's subscriptionIDsubscriptionUpdateData: 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?
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)")
}
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With