how to get key from respective value in a NSDictionary? - ios

how to get key from respective value in a NSDictionary?
I am aware of allKeys function but do we have a method which returns a single key for a single value.

Well because a value can be in a NSDictionary multiple times, there is no way to just say "Give me the key for this value". But you CAN say "Give me all keys containing this value".
NSArray* arrayOfKeys = [yourDictionary allKeysForObject:myObject];
If the value is only once in the dictionary, you can just extract it, using:
YourObject* o = [arrayOfKeys firstObject];
But, always do a NIL and count check on this array. Out of bounds exceptions ahead!
P.S. Credits to #Hagile for firstObject method instead of objectAtIndex:0

Related

how to parse a dictionary inside an array, which is in a dictionary

In my JSON response i receive a dictionary, which has a array, inside that array is a dictionary with few key-values, to make it simple to understand here is the JSON response:
{
weather = (
{
description = haze;
icon = 50n;
id = 721;
main = Haze;
}
);
}
I want to know how can i retrieve the elements description, icon, id and main. Suppose i have a NSString called str, how can i add the value of description to this string. I have tried many different things, but none seem to work. The one i thought should work, but didn't is:
str = [[[dir valueForKey:#"weather"] objectAtIndex:0] valueForKey:#"description"];
Can someone let me know how can i access those 4 values. I don't want to create a new array of those values and then retrieve them. Regards.
Use NSJSONSerialization to convert your JSON data to NSObjects.
Then you need to index into your objects based on their structure.
If the structure is fixed, and guaranteed, you can do it with fixed indexes/keys:
//data in theJSONDict.
NSArray *outerArray = theJSONDict[#"weather"];
NSDictionary *firstWeatherItem = outerArray[0];
NSString *firstItemDesc = firstWeatherItem[#"description"];
You could also do it all in 1 line:
firstItemDesc = theJSONDict[#"weather"][0][#"description"];
But that is much harder to debug.
If this is JSON data coming from a server you need to code more defensively than above, and write code that tries to fetch keys from dictionaries, tests for nil, and either loops through the array(s) using the count of objects, or tests the length of the array before blindly indexing into it. Otherwise you'll likely crash if your input data's format doesn't match your assumptions.
(BTW, do not use valueForKey for this. That is KVO code, and while it usually works, it is not the same as using NSArray and NSDictionary methods to fetch the data, and sometimes does not work correctly.)

Replace some contents of NSMutableDictionary with another NSMutableDictionary

i am having 2 NSMutableDictionaries that each has 5 NSArrays inside,
these 2 NSMutableDictionaries have excactly the same 5 keys and NSArrays but with different content,
i need to replace only 2 Arrays with the Arrays of the other NSMutableDictionary
so
dic1 = dic2; //isn't a solution...will replace all the contents of the one to the other...
i need something that can replace the object of a specific key with the other same key.
i tried
[dic1 setObject:[dic2 objectForKey:#"key1"] forKey:#"key1"];
[dic1 setObject:[dic2 objectForKey:#"key2"] forKey:#"key2"];
and i get ERROR: attempt to insert nil value (key: key1)'
The error just means [dic2 objectForKey:#"key1"] is returning a nil value. In other words, that key does not exist in the dictionary. Likewise, you can't set a nil value inside of an NSDictionary, so thats why the error is sent out.
Print out each of the dictionaries and ensure your keys/values are what you expect. You can use an NSLog or just pause the program with a breakpoint, and enter po dic1 in the console.

How to change one value in NSMutableDictionary

I have a NSMutableDictionary with one key and it has the following values.
How can I change the value in item2 from 1 to 0? That's the only change I need.
The only way I have found is to recreate this whole key from scratch, change that one value and then delete that key and replace it with a new one. Is there any easier solution than that?
I will assume you get dict as an instance of NSMutableDictionary somehow:
NSMutableArray *tmp = [dict[#"07:00 AM.infoKey"] mutableCopy];
tmp[2] = #"0";
dict[#"07:00 AM.infoKey"] = tmp;
Unfortunately with nested arrays in dictionaries, the arrays aren't automatically mutable so there isn't any better method to doing so, like you observed.

How to turn UITextField user input into a usable pointer to a dictionary key?

I am trying to take a user input in a UIText field and turn it into a pointer that will access a dictionary key and then return the corresponding value for use in an equation. I feel like I am in the ballpark but I can't figure out how to make it work.
The keys are going to be float values, and the user input is the key itself. I realize that sounds confusing. Here's an example: The user inputs 44.25 in the UITextField. I need this user input to find the 44.25 key in my dictionary and then return the corresponding value associated with that key that will then plug into a simple equation.
Here is my code calling the dictionary (which works) and my attempt at making a pointer out of the input, which does not work.
Thanks in advance for your help.
NSString *path = [[NSBundle mainBundle] pathForResource:#"myDictionary" ofType:#"plist"];
NSDictionary *myDictionary = [NSDictionary dictionaryWithContentsOfFile: path];
float inches = [self.inchesText.text floatValue];
NSLog(#"%.2f", apples);
NSLog(#"There are %# oranges", MyDictionary [apples]);
Just take the text from your text field and use it in a call to ojectForKey. Make sure you code for the (likely) case where the user-entered key can't be found in the dictionary and you get back a nil.
The code is dirt simple, and might look something like this:
NSString *key = self.inchesText.text;
NSString *value = myDictionary[key];
if (value == nil)
//Tell the user they entered an invalid key
else
//Do whatever you need to do with the fetched value.
As far as I know all keys for NSDictionaries need to be objects, not primitives. That being said you could create an object around your primitive with NSNumber objects.
I don't think that would help you though. Since you are reading the NSDictionary straight from file I would assume they are being read into the Dictionary as NSString values (#"44.25" instead of the number 44.25). If that is the case then you could just pass the pointer to the textfield.text to retrieve your desired Dictionary element (assuming the text is equal to one of your dictionary keys in the file).

Saving IOS dictionary with arrays as keys

i am working with Tapku's Calendar, and i want to save some values that will be user inputed.
But i am kind of stumbled on how i would achive this, here is the layout:
// allocate the arrays and dictionary
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSMutableArray *dateValueArray = [[NSMutableArray alloc] init];
// set array values
[dateValueArray addObject:#"first string"];
[dateValueArray addObject:#"Second string"];
// set dictionary with date as key, and array as value
[dict setObject:dateValueArray forKey:testdate];
The dictionary dict, will be the only Dictionary, but since that dictionary uses arrays for objects, i would have multiple arrays.
So, lets say there are multiple dates registerd in "dict", different keys would have to use different arrays? Sorry i am abit confused my self here.
Is there any way i can use 1 array to store all the strings associated with different dictionary keys ?
EDIT 1
Elaboration:
The whole idea is that the user can input text that are associated with dates.
I will need to store these values and i will need to store which date they are associated to.
So i have multiple values in an array, associated with 1 date in a dictionary.
And keeping in mind that i will have to store this, i would like to know how i should assign the values to the dates.
EDIT 2:
Basically what i need for the Array is something like AddObject ForKey
Edit 3
More elaboration::
Basically i want to access the values in this manner:
[date1][note1]
[date1][note2]
[date2][note1]
[date2][note2]
And the amount of values in both date and note are variable.
If I understand what you are asking about, what you want is the property of NSDictionary allKeys which is an array of all the keys in that dictionary.
Now I see your edit. You are in the right way. To perform what you are looking for, do something like this:
First, allocate your dict somewhre:
// allocate the arrays and dictionary
NSMutableDictionary *dict = [NSMutableDictionary new];
Now, everytime you get a new date with a new string, first check if there's the first string for that date. If yes, create a new array. If not, add your string inside the previously array.
NSMutableArray *valuesForDate = dict[givenDate];
if (!valuesForDate)
{
valuesForDate [NSMutableArray new];
dict[givenDate] = valuesForDate
}
[valuesForDate addObject:#"first string for dateGiven"];
[valuesForDate addObject:#"Second string for dateGiven"];
Now you can retrieve the values with something like you wanted:
NSString *test = dict[date1][0]; //first string associated for date1
NArray *allStringsForDate2 = dict[date2]; //array with all the strings for date2
You can try using NSMapTable instead of NSDictionary, which is much more flexible but also much harder to use. You'll also find it hard to find anyone knowing the answers if you have questions about NSMapTable. But you can definitely create an NSMapTable which will use pointers of objects as keys, instead of the values.

Resources