Access a dictionary in dictionary - ios

I have a dictionary which contains another dictionary:
var channelDict = Dictionary<String, AnyObject>()
channelDict["image"] = Dictionary<String, AnyObject>()
Now I want to add value to the child dictionary, I tried the following but nothing worked:
channelDict["image"]["key"] = "value"
var:Dictionary<String, AnyObject> dict = channelDict["image"]
dict["key"] = "value"
if var dict = channelDict["image"] {
dict["Key"] = "value"
}

This way you can add a dictionary to the "image" key:
channelDict["image"] = ["key": "value"]
UPDATED
And if you want to add values to the inner dict and keep the existing values, you should create a temporary variable like this:
var innerDict = channelDict["image"] as [String: AnyObject]
innerDict["dsa"] = "dsa"
channelDict["image"] = innerDict

Related

how to append an array of dictionaries to another array

I tried to append an array of dictionaries which are coming from server to a globally declared array.but i am getting an error like "Cannot convert value of type '[Any]' to expected argument type '[String : Any]'"if anyone helps me would be great.Thanks in advance
var pro = [[String:Any]]()
var productsdetails = Array<Any>()
productsdetails = userdata.value(forKey: "products") as! Array
print("response\(productsdetails)")
self.pro = self.pro.append(productsdetails)
print(self.pro)
Use this code like below, i hope this works
var pro = [[String:Any]]()
if let productsdetails = userdata.value(forKey: "products") as? [[String:Any]] {
print("response\(productsdetails)")
self.pro.append(productsdetails)
print(self.pro)
}
to solve this iterate
var pro = [[String:Any]]()
if let productsdetails = userdata.value(forKey: "products") as? [[String: Any]] {
for details in productsdetails {
pro.append(details)
}
}
or you may use directly self.pro = productsdetails if you not to want iterate
**image shows [String : String] as I have used [String : String] instead of [String : Any]*
You can try this: (Swift-4.2)
var data: [String: Any] = [
"key1": "example value 1",
"key2": "example value 2",
"items": []
]
for index in 1...3 {
let item: [String: Any] = [
"key": "new value"
]
// get existing items, or create new array if doesn't exist
var existingItems = data["items"] as? [[String: Any]] ?? [[String: Any]]()
// append the item
existingItems.append(item)
// replace back into `data`
data["items"] = existingItems
}
Answer same as: Append to array in [String: Any] dictionary structure
Can you show us your response which has key products? As there is mismatch with the variable pro and productdetails. As i see pro holds values as "Array of Dictionary with key as String type and Value as Any type" which again has Array above it and productdetails is expecting Array of Any type not the Array of Dictionary Type. Assuming your products has Array of String Type or can be even a class object type you can do it as below.
var pro = Array<Any>() //Or You can make Array<String>() or Array<CustomClass>()
var userdata:[String:[String]] = ["products":["One","Two","Three"]]
var productsdetails = Array<Any>()
productsdetails = userdata["products"] ?? []
print("response\(productsdetails)")
pro.append(productsdetails)

How store items of a dictionary to another dictionary with a key in swift?

I got a dictionary say dict1 with some keys and values and i want to store all the values of dict1 to another dictionary say dict2 with a key and i tried parse them to JSON using SwiftyJson.
What i tried has been given below,
var dict1 = [String: String]()
var dict2 = [String: String]()
// Values of dict1
dict1["details"] = "XXXXX"
//trying to save values of dict1 to dict2
dict2["moreDetails"] = dict1 as? String
let jsonValue = JSON(dict2)
print(jsonValue)
What i obtain is an empty jsonString like this { }
What i actually want to get is
{
"moreDetails" :{
"details" : "XXXXX"
}
}
How could i achieve the above
As AshvinGudaliya's comment suggests, the issue is the type of dict2 - you've typed it as [String: String], and then you try to put an object of type [String: String] as a value - but it will only accept String values.
Creating dict2 as a [String: Any] will allow you to add a non-string value to it, in this case the contents of dict1, a [String: String]

Get dictionary from NSMutableArray of dictionary

I'm trying to get a NSMutableDictionary from a NSMutableArray.
I set my array this way:
let test : NSMutableDictionary = NSMutableDictionary()
test.setValue("Monday", forKey: "day")
test.setValue("7PM - 8PM", forKey: "hour")
self.availabilityArray.add(test)
let test1 : NSMutableDictionary = NSMutableDictionary()
test1.setValue("Saturday", forKey: "day")
test1.setValue("8PM - 10PM", forKey: "hour")
self.availabilityArray.add(test1)
let test2 : NSMutableDictionary = NSMutableDictionary()
test2.setValue("Sunday", forKey: "day")
test2.setValue("2PM - 8PM", forKey: "hour")
self.availabilityArray.add(test2)
And in another method I try to get the "day" and "hour" value to set them in a UILabel.
I've tried to do this :
let dico = self.availabilityArray[i] //i being the index of a loop, not important here
self.dayNameLabel.text = (dico as AnyObject).object(forKey:"day") // This line does not work, I want to do something like that.
So how can I get the content of my NSMutableArray for a precise index as a NSDictionary ?
Thanks.
Thanks to Larme I found the solution, I juste replace
self.dayNameLabel.text = (dico as AnyObject).object(forKey:"day")
With
self.dayNameLabel.text = (dico as! NSMutableDictionary).object(forKey:"day") as! String?
You should use swift 2 (or 3) objects.
declare your array like that :
var availabilityArray: [[String: String]] = []
then create your dictionaries :
var test: [String: String] = [:]
test["day"] = "Monday"
test["hour"] = "7PM - 8PM"
var test1: [String: String] = [:]
test1["day"] = "Saturday"
test1["hour"] = "8PM - 10PM"
var test2: [String: String] = [:]
test2["day"] = "Sunday"
test2["hour"] = "2PM - 8PM"
add them to the array :
self.availabilityArray.append(test)
self.availabilityArray.append(test1)
self.availabilityArray.append(test2)
and finally access the object :
let dico = self.availabilityArray[0]
self.dayNameLabel.text = dico["day"]
dico["day"] is optional, so use dico["day"]! or use a real unwrap with if let

Appending Dictionary to Swift Array

I have this Swift code in which I'm trying to append a Dictionary to Array.
var savedFiles: [Dictionary<String, AnyObject>] = []
var newEntry = Dictionary<String,AnyObject>()
if let audio = receivedAudio?.filePathURL {
newEntry["url"] = audio
}
newEntry["name"] = caption
savedFiles.append(newEntry! as Dictionary<String,AnyObject>)
This gives me an error on last line (in append) Cannot invoke 'append' with an argument list of type '(Dictionary<String, AnyObject>)'
Any idea? I also tried remove force unwrapping as well.
Please try this:
var savedFiles: [[String: AnyObject]] = []
var newEntry: [String: AnyObject] = [:]
if let audio = receivedAudio?.filePathURL {
newEntry["url"] = audio
}
newEntry["name"] = caption
savedFiles.append(newEntry)
Hi just tried on playground its working, only you should know this: audio could be nil any time, in that case this key value pair won't be added in newEntryDictionary.
var savedFilesDictionary = [[String: AnyObject]]()
var newEntryDictionary = [String: AnyObject]()
var receivedAudio = NSURL(string: "/something/some")
if let audio = receivedAudio?.filePathURL {
newEntryDictionary["url"] = audio
}
newEntryDictionary["name"] = "some caption"
savedFilesDictionary.append(newEntryDictionary)
As of Swift 4, the correct way to work with dictionaries:
Declare empty dictionary (associative array):
var namesOfIntegers = [Int: String]()
Append to dictionary:
namesOfIntegers[16] = "sixteen"
Check if dictionary contains key:
let key = 16
if namesOfIntegers.keys.contains(key) {
// Does contain array key (will print 16)
print(namesOfIntegers[key])
}
See more, straight from Apple: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html
Absolutely no problem:
var savedFiles: [Dictionary<String, AnyObject>] = []
var newEntry = Dictionary<String, AnyObject>()
newEntry["key"] = "value"
savedFiles.append(newEntry)
Although this is the "Swifty"-Style:
var savedFiles = [[String: AnyObject]]()
var newEntry = [String: AnyObject]()
newEntry["key"] = "value"
savedFiles.append(newEntry)
I am using Xcode 7.2.1.
var savedFilesDictionary = [String: AnyObject]()
var newEntryDictionary = [String: AnyObject]()
if let audio = receivedAudio?.filePathURL {
newEntryDictionary["url"] = audio
}
newEntryDictionary["name"] = caption
savedFilesDictionary.append(newEntryDictionary)
Try this.

Swift: declare an empty dictionary

I am beginning to learn swift by following the iBook-The Swift Programming Language on Swift provided by Apple. The book says to create an empty dictionary one should use [:] same as while declaring array as []:
I declared an empty array as follows :
let emptyArr = [] // or String[]()
But on declaring empty dictionary, I get syntax error:
let emptyDict = [:]
How do I declare an empty dictionary?
var emptyDictionary = [String: String]()
var populatedDictionary = ["key1": "value1", "key2": "value2"]
Note: if you're planning to change the contents of the dictionary over time then declare it as a variable (var). You can declare an empty dictionary as a constant (let) but it would be pointless if you have the intention of changing it because constant values can't be changed after initialization.
You can't use [:] unless type information is available.
You need to provide it explicitly in this case:
var dict = Dictionary<String, String>()
var means it's mutable, so you can add entries to it.
Conversely, if you make it a let then you cannot further modify it (let means constant).
You can use the [:] shorthand notation if the type information can be inferred, for instance
var dict = ["key": "value"]
// stuff
dict = [:] // ok, I'm done with it
In the last example the dictionary is known to have a type Dictionary<String, String> by the first line. Note that you didn't have to specify it explicitly, but it has been inferred.
The Swift documentation recommends the following way to initialize an empty Dictionary:
var emptyDict = [String: String]()
I was a little confused when I first came across this question because different answers showed different ways to initialize an empty Dictionary. It turns out that there are actually a lot of ways you can do it, though some are a little redundant or overly verbose given Swift's ability to infer the type.
var emptyDict = [String: String]()
var emptyDict = Dictionary<String, String>()
var emptyDict: [String: String] = [:]
var emptyDict: [String: String] = [String: String]()
var emptyDict: [String: String] = Dictionary<String, String>()
var emptyDict: Dictionary = [String: String]()
var emptyDict: Dictionary = Dictionary<String, String>()
var emptyDict: Dictionary<String, String> = [:]
var emptyDict: Dictionary<String, String> = [String: String]()
var emptyDict: Dictionary<String, String> = Dictionary<String, String>()
After you have an empty Dictionary you can add a key-value pair like this:
emptyDict["some key"] = "some value"
If you want to empty your dictionary again, you can do the following:
emptyDict = [:]
The types are still <String, String> because that is how it was initialized.
Use this will work.
var emptyDict = [String: String]()
You can simply declare it like this:
var emptyDict:NSMutableDictionary = [:]
You have to give the dictionary a type
// empty dict with Ints as keys and Strings as values
var namesOfIntegers = Dictionary<Int, String>()
If the compiler can infer the type, you can use the shorter syntax
namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type Int, String
Declaring & Initializing Dictionaries in Swift
Dictionary of String
var stringDict: [String: String] = [String: String]()
OR
var stringDict: Dictionary<String, String> = Dictionary<String, String>()
Dictionary of Int
var stringDict: [String: Int] = [String: Int]()
OR
var stringDict: Dictionary<String, Int> = Dictionary<String, Int>()
Dictionary of AnyObject
var stringDict: [String: AnyObject] = [String: AnyObject]()
OR
var stringDict: Dictionary<String, AnyObject> = Dictionary<String, AnyObject>()
Dictionary of Array of String
var stringDict: [String: [String]] = [String: [String]]()
OR
var stringDict: Dictionary<String, Array<String>> = Dictionary<String, Array<String>>()
Array of Dictionaries of String
var stringDict: [[String: String]] = [[String: String]]()
OR
var stringDict: Array<Dictionary<String, String>> = Array<Dictionary<String, String>>()
Swift:
var myDictionary = Dictionary<String, AnyObject>()
I'm playing with this too. It seems strange that you can just declare an empty dictionary and then add a key/value pair to it like so :
var emptyDictionary = Dictionary<String, Float>()
var flexDictionary = [:]
emptyDictionary["brian"] = 4.5
flexDictionary["key"] = "value" // ERROR : cannot assign to the result of this expression
But you can create a Dictionary that accepts different value types by using the "Any" type like so :
var emptyDictionary = Dictionary<String, Any>()
emptyDictionary["brian"] = 4.5
emptyDictionary["mike"] = "hello"
You need to explicitly tell the data type or the type can be inferred when you declare anything in Swift.
Swift 3
The sample below declare a dictionary with key as a Int type and the value as a String type.
Method 1: Initializer
let dic = Dictionary<Int, String>()
Method 2: Shorthand Syntax
let dic = [Int:String]()
Method 3: Dictionary Literal
var dic = [1: "Sample"]
// dic has NOT to be a constant
dic.removeAll()
If you want to create a generic dictionary with any type
var dictionaryData = [AnyHashable:Any]()
Swift 4
let dicc = NSDictionary()
//MARK: - This is empty dictionary
let dic = ["":""]
//MARK:- This is variable dic means if you want to put variable
let dic2 = ["":"", "":"", "":""]
//MARK:- Variable example
let dic3 = ["name":"Shakeel Ahmed", "imageurl":"https://abc?abc.abc/etc", "address":"Rawalpindi Pakistan"]
//MARK: - This is 2nd Variable Example dictionary
let dic4 = ["name": variablename, "city": variablecity, "zip": variablezip]
//MARK:- Dictionary String with Any Object
var dic5a = [String: String]()
//MARK:- Put values in dic
var dic5a = ["key1": "value", "key2":"value2", "key3":"value3"]
var dic5b = [String:AnyObject]()
dic5b = ["name": fullname, "imageurl": imgurl, "language": imgurl] as [String : AnyObject]
or
//MARK:- Dictionary String with Any Object
let dic5 = ["name": fullname, "imageurl": imgurl, "language": imgurl] as [String : AnyObject]
//MARK:- More Easy Way
let dic6a = NSDictionary()
let dic6b = NSMutalbeDictionary()
To create an empty dictionary with the [:] aka the empty dictionary literal, you actually need to provide the context first as in the type of both the key and the value. The correct way to use the [:] to create an empty dictionary is:
var dict: [String: Int] = [:]
I'm usually using
var dictionary:[String:String] = [:]
dictionary.removeAll()
You can declare it as nil with the following:
var assoc : [String:String]
Then nice thing is you've already typeset (notice I used var and not let, think of these as mutable and immutable). Then you can fill it later:
assoc = ["key1" : "things", "key2" : "stuff"]
You can use the following code:
var d1 = Dictionary<Int, Int>()
var d2 = [Int: Int]()
var d3: Dictionary<Int, Int> = [Int : Int]()
var d4: [Int : Int] = [:]
var dictList = String:String for dictionary in swift
var arrSectionTitle = String for array in swift
var parking = [Dictionary < String, Double >()]
^ this adds a dictionary for a [string:double] input
It is very handy for finding your way
var dict:Dictionary = [:]

Resources