├── .gitignore ├── LICENSE ├── NSDictionary+JKSafeAccess.h ├── NSDictionary+JKSafeAccess.m └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | #Pods/ 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /NSDictionary+JKSafeAccess.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSDictionary+JKSafeAccess.h 3 | // JKCategories (https://github.com/shaojiankui/JKCategories) 4 | // 5 | // Created by Jakey on 15/1/25. 6 | // Copyright (c) 2015年 www.skyfox.org. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSDictionary (JKSafeAccess) 13 | - (BOOL)jk_hasKey:(NSString *)key; 14 | 15 | - (NSString*)jk_stringForKey:(id)key; 16 | 17 | - (NSNumber*)jk_numberForKey:(id)key; 18 | 19 | - (NSDecimalNumber *)jk_decimalNumberForKey:(id)key; 20 | 21 | - (NSArray*)jk_arrayForKey:(id)key; 22 | 23 | - (NSDictionary*)jk_dictionaryForKey:(id)key; 24 | 25 | - (NSInteger)jk_integerForKey:(id)key; 26 | 27 | - (NSUInteger)jk_unsignedIntegerForKey:(id)key; 28 | 29 | - (BOOL)jk_boolForKey:(id)key; 30 | 31 | - (int16_t)jk_int16ForKey:(id)key; 32 | 33 | - (int32_t)jk_int32ForKey:(id)key; 34 | 35 | - (int64_t)jk_int64ForKey:(id)key; 36 | 37 | - (char)jk_charForKey:(id)key; 38 | 39 | - (short)jk_shortForKey:(id)key; 40 | 41 | - (float)jk_floatForKey:(id)key; 42 | 43 | - (double)jk_doubleForKey:(id)key; 44 | 45 | - (long long)jk_longLongForKey:(id)key; 46 | 47 | - (unsigned long long)jk_unsignedLongLongForKey:(id)key; 48 | 49 | - (NSDate *)jk_dateForKey:(id)key dateFormat:(NSString *)dateFormat; 50 | 51 | //CG 52 | - (CGFloat)jk_CGFloatForKey:(id)key; 53 | 54 | - (CGPoint)jk_pointForKey:(id)key; 55 | 56 | - (CGSize)jk_sizeForKey:(id)key; 57 | 58 | - (CGRect)jk_rectForKey:(id)key; 59 | @end 60 | 61 | #pragma --mark NSMutableDictionary setter 62 | 63 | @interface NSMutableDictionary(SafeAccess) 64 | 65 | -(void)jk_setObj:(id)i forKey:(NSString*)key; 66 | 67 | -(void)jk_setString:(NSString*)i forKey:(NSString*)key; 68 | 69 | -(void)jk_setBool:(BOOL)i forKey:(NSString*)key; 70 | 71 | -(void)jk_setInt:(int)i forKey:(NSString*)key; 72 | 73 | -(void)jk_setInteger:(NSInteger)i forKey:(NSString*)key; 74 | 75 | -(void)jk_setUnsignedInteger:(NSUInteger)i forKey:(NSString*)key; 76 | 77 | -(void)jk_setCGFloat:(CGFloat)f forKey:(NSString*)key; 78 | 79 | -(void)jk_setChar:(char)c forKey:(NSString*)key; 80 | 81 | -(void)jk_setFloat:(float)i forKey:(NSString*)key; 82 | 83 | -(void)jk_setDouble:(double)i forKey:(NSString*)key; 84 | 85 | -(void)jk_setLongLong:(long long)i forKey:(NSString*)key; 86 | 87 | -(void)jk_setPoint:(CGPoint)o forKey:(NSString*)key; 88 | 89 | -(void)jk_setSize:(CGSize)o forKey:(NSString*)key; 90 | 91 | -(void)jk_setRect:(CGRect)o forKey:(NSString*)key; 92 | @end -------------------------------------------------------------------------------- /NSDictionary+JKSafeAccess.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSDictionary+JKSafeAccess.m 3 | // JKCategories (https://github.com/shaojiankui/JKCategories) 4 | // 5 | // Created by Jakey on 15/1/25. 6 | // Copyright (c) 2015年 www.skyfox.org. All rights reserved. 7 | // 8 | 9 | #import "NSDictionary+JKSafeAccess.h" 10 | 11 | @implementation NSDictionary (JKSafeAccess) 12 | - (BOOL)jk_hasKey:(NSString *)key 13 | { 14 | return [self objectForKey:key] != nil; 15 | } 16 | 17 | - (NSString*)jk_stringForKey:(id)key 18 | { 19 | id value = [self objectForKey:key]; 20 | if (value == nil || value == [NSNull null]) 21 | { 22 | return nil; 23 | } 24 | if ([[value description] isEqualToString:@"(null)"]) { 25 | return nil; 26 | } 27 | if ([value isKindOfClass:[NSString class]]) { 28 | return (NSString*)value; 29 | } 30 | if ([value isKindOfClass:[NSNumber class]]) { 31 | return [value stringValue]; 32 | } 33 | 34 | return nil; 35 | } 36 | 37 | - (NSNumber*)jk_numberForKey:(id)key 38 | { 39 | id value = [self objectForKey:key]; 40 | if ([value isKindOfClass:[NSNumber class]]) { 41 | return (NSNumber*)value; 42 | } 43 | if ([value isKindOfClass:[NSString class]]) { 44 | NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 45 | [f setNumberStyle:NSNumberFormatterDecimalStyle]; 46 | return [f numberFromString:(NSString*)value]; 47 | } 48 | return nil; 49 | } 50 | 51 | - (NSDecimalNumber *)jk_decimalNumberForKey:(id)key { 52 | id value = [self objectForKey:key]; 53 | 54 | if ([value isKindOfClass:[NSDecimalNumber class]]) { 55 | return value; 56 | } else if ([value isKindOfClass:[NSNumber class]]) { 57 | NSNumber * number = (NSNumber*)value; 58 | return [NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]]; 59 | } else if ([value isKindOfClass:[NSString class]]) { 60 | NSString * str = (NSString*)value; 61 | return [str isEqualToString:@""] ? nil : [NSDecimalNumber decimalNumberWithString:str]; 62 | } 63 | return nil; 64 | } 65 | 66 | 67 | - (NSArray*)jk_arrayForKey:(id)key 68 | { 69 | id value = [self objectForKey:key]; 70 | if (value == nil || value == [NSNull null]) 71 | { 72 | return nil; 73 | } 74 | if ([value isKindOfClass:[NSArray class]]) 75 | { 76 | return value; 77 | } 78 | return nil; 79 | } 80 | 81 | - (NSDictionary*)jk_dictionaryForKey:(id)key 82 | { 83 | id value = [self objectForKey:key]; 84 | if (value == nil || value == [NSNull null]) 85 | { 86 | return nil; 87 | } 88 | if ([value isKindOfClass:[NSDictionary class]]) 89 | { 90 | return value; 91 | } 92 | return nil; 93 | } 94 | 95 | - (NSInteger)jk_integerForKey:(id)key 96 | { 97 | id value = [self objectForKey:key]; 98 | if (value == nil || value == [NSNull null]) 99 | { 100 | return 0; 101 | } 102 | if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]]) 103 | { 104 | return [value integerValue]; 105 | } 106 | return 0; 107 | } 108 | - (NSUInteger)jk_unsignedIntegerForKey:(id)key{ 109 | id value = [self objectForKey:key]; 110 | if (value == nil || value == [NSNull null]) 111 | { 112 | return 0; 113 | } 114 | if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]]) 115 | { 116 | return [value unsignedIntegerValue]; 117 | } 118 | return 0; 119 | } 120 | - (BOOL)jk_boolForKey:(id)key 121 | { 122 | id value = [self objectForKey:key]; 123 | 124 | if (value == nil || value == [NSNull null]) 125 | { 126 | return NO; 127 | } 128 | if ([value isKindOfClass:[NSNumber class]]) 129 | { 130 | return [value boolValue]; 131 | } 132 | if ([value isKindOfClass:[NSString class]]) 133 | { 134 | return [value boolValue]; 135 | } 136 | return NO; 137 | } 138 | - (int16_t)jk_int16ForKey:(id)key 139 | { 140 | id value = [self objectForKey:key]; 141 | 142 | if (value == nil || value == [NSNull null]) 143 | { 144 | return 0; 145 | } 146 | if ([value isKindOfClass:[NSNumber class]]) 147 | { 148 | return [value shortValue]; 149 | } 150 | if ([value isKindOfClass:[NSString class]]) 151 | { 152 | return [value intValue]; 153 | } 154 | return 0; 155 | } 156 | - (int32_t)jk_int32ForKey:(id)key 157 | { 158 | id value = [self objectForKey:key]; 159 | 160 | if (value == nil || value == [NSNull null]) 161 | { 162 | return 0; 163 | } 164 | if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) 165 | { 166 | return [value intValue]; 167 | } 168 | return 0; 169 | } 170 | - (int64_t)jk_int64ForKey:(id)key 171 | { 172 | id value = [self objectForKey:key]; 173 | 174 | if (value == nil || value == [NSNull null]) 175 | { 176 | return 0; 177 | } 178 | if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) 179 | { 180 | return [value longLongValue]; 181 | } 182 | return 0; 183 | } 184 | - (char)jk_charForKey:(id)key{ 185 | id value = [self objectForKey:key]; 186 | 187 | if (value == nil || value == [NSNull null]) 188 | { 189 | return 0; 190 | } 191 | if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) 192 | { 193 | return [value charValue]; 194 | } 195 | return 0; 196 | } 197 | - (short)jk_shortForKey:(id)key 198 | { 199 | id value = [self objectForKey:key]; 200 | 201 | if (value == nil || value == [NSNull null]) 202 | { 203 | return 0; 204 | } 205 | if ([value isKindOfClass:[NSNumber class]]) 206 | { 207 | return [value shortValue]; 208 | } 209 | if ([value isKindOfClass:[NSString class]]) 210 | { 211 | return [value intValue]; 212 | } 213 | return 0; 214 | } 215 | - (float)jk_floatForKey:(id)key 216 | { 217 | id value = [self objectForKey:key]; 218 | 219 | if (value == nil || value == [NSNull null]) 220 | { 221 | return 0; 222 | } 223 | if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) 224 | { 225 | return [value floatValue]; 226 | } 227 | return 0; 228 | } 229 | - (double)jk_doubleForKey:(id)key 230 | { 231 | id value = [self objectForKey:key]; 232 | 233 | if (value == nil || value == [NSNull null]) 234 | { 235 | return 0; 236 | } 237 | if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) 238 | { 239 | return [value doubleValue]; 240 | } 241 | return 0; 242 | } 243 | - (long long)jk_longLongForKey:(id)key 244 | { 245 | id value = [self objectForKey:key]; 246 | if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]]) { 247 | return [value longLongValue]; 248 | } 249 | return 0; 250 | } 251 | 252 | - (unsigned long long)jk_unsignedLongLongForKey:(id)key 253 | { 254 | id value = [self objectForKey:key]; 255 | if ([value isKindOfClass:[NSString class]]) { 256 | NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; 257 | value = [nf numberFromString:value]; 258 | } 259 | if ([value isKindOfClass:[NSNumber class]]) { 260 | return [value unsignedLongLongValue]; 261 | } 262 | return 0; 263 | } 264 | 265 | - (NSDate *)jk_dateForKey:(id)key dateFormat:(NSString *)dateFormat{ 266 | NSDateFormatter *formater = [[NSDateFormatter alloc]init]; 267 | formater.dateFormat = dateFormat; 268 | id value = [self objectForKey:key]; 269 | 270 | if (value == nil || value == [NSNull null]) 271 | { 272 | return nil; 273 | } 274 | 275 | if ([value isKindOfClass:[NSString class]] && ![value isEqualToString:@""] && !dateFormat) { 276 | return [formater dateFromString:value]; 277 | } 278 | return nil; 279 | } 280 | 281 | 282 | //CG 283 | - (CGFloat)jk_CGFloatForKey:(id)key 284 | { 285 | CGFloat f = [self[key] doubleValue]; 286 | return f; 287 | } 288 | 289 | - (CGPoint)jk_pointForKey:(id)key 290 | { 291 | CGPoint point = CGPointFromString(self[key]); 292 | return point; 293 | } 294 | - (CGSize)jk_sizeForKey:(id)key 295 | { 296 | CGSize size = CGSizeFromString(self[key]); 297 | return size; 298 | } 299 | - (CGRect)jk_rectForKey:(id)key 300 | { 301 | CGRect rect = CGRectFromString(self[key]); 302 | return rect; 303 | } 304 | @end 305 | 306 | #pragma --mark NSMutableDictionary setter 307 | @implementation NSMutableDictionary (JKSafeAccess) 308 | -(void)jk_setObj:(id)i forKey:(NSString*)key{ 309 | if (i!=nil) { 310 | self[key] = i; 311 | } 312 | } 313 | -(void)jk_setString:(NSString*)i forKey:(NSString*)key; 314 | { 315 | [self setValue:i forKey:key]; 316 | } 317 | -(void)jk_setBool:(BOOL)i forKey:(NSString *)key 318 | { 319 | self[key] = @(i); 320 | } 321 | -(void)jk_setInt:(int)i forKey:(NSString *)key 322 | { 323 | self[key] = @(i); 324 | } 325 | -(void)jk_setInteger:(NSInteger)i forKey:(NSString *)key 326 | { 327 | self[key] = @(i); 328 | } 329 | -(void)jk_setUnsignedInteger:(NSUInteger)i forKey:(NSString *)key 330 | { 331 | self[key] = @(i); 332 | } 333 | -(void)jk_setCGFloat:(CGFloat)f forKey:(NSString *)key 334 | { 335 | self[key] = @(f); 336 | } 337 | -(void)jk_setChar:(char)c forKey:(NSString *)key 338 | { 339 | self[key] = @(c); 340 | } 341 | -(void)jk_setFloat:(float)i forKey:(NSString *)key 342 | { 343 | self[key] = @(i); 344 | } 345 | -(void)jk_setDouble:(double)i forKey:(NSString*)key{ 346 | self[key] = @(i); 347 | } 348 | -(void)jk_setLongLong:(long long)i forKey:(NSString*)key{ 349 | self[key] = @(i); 350 | } 351 | -(void)jk_setPoint:(CGPoint)o forKey:(NSString *)key 352 | { 353 | self[key] = NSStringFromCGPoint(o); 354 | } 355 | -(void)jk_setSize:(CGSize)o forKey:(NSString *)key 356 | { 357 | self[key] = NSStringFromCGSize(o); 358 | } 359 | -(void)jk_setRect:(CGRect)o forKey:(NSString *)key 360 | { 361 | self[key] = NSStringFromCGRect(o); 362 | } 363 | @end 364 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NSDictionary-SafeAccess 2 | 非常有助于IOS字典读写的轻量级扩展,Very useful safe accessors for NSDictionary,a lightweight NSDictionary access category 3 | 4 | 比如网络请求回来的JSON解析成字典后,数据的读取常常因为NULL而程序崩溃,有了SafeAccess 5 | 6 | #妈妈再也不用担心NULL啦 7 | 8 | #使用方法 9 | ##读取 getter 10 | NSDictionary *responseObject = /....... 11 | 12 | NSDictionary *dic = [responseObject dictionaryForKey:@"object"]; 13 | 14 | NSArray *array = [responseObject arrayForKey:@"array"]; 15 | 16 | NSString *string = [responseObject stringForKey:@"string"]; 17 | 18 | long long date = [responseObject longLongForKey:@"date"]; 19 | 20 | NSNumber *number = [responseObject numberForKey:@"number"]; 21 | 22 | NSInteger count = [responseObject integerForKey:@"count"]; 23 | 24 | BOOL b = [responseObject boolForKey:@"count"]; 25 | 26 | CGPoint point = [responseObject pointForKey:@"point"]; 27 | 28 | CGFloat f = [responseObject CGFloatForKey:@"float"]; 29 | 30 | CGRect rect = [responseObject rectForKey:@"rect"]; 31 | 32 | CGSize size = [responseObject sizeForKey:@"size"]; 33 | ##写入 setter 34 | NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 35 | 36 | [dict setObj:@"334" forKey:@"obj"]; 37 | 38 | [dict setString:@"string" forKey:@"str"]; 39 | 40 | [dict setBool:YES forKey:@"b"]; 41 | 42 | [dict setInt:1 forKey:@"intvalue"]; 43 | 44 | [dict setCGFloat:1.1 forKey:@"float"]; 45 | 46 | [dict setPoint:CGPointMake(1, 1) forKey:@"point"]; 47 | 48 | [dict setSize:CGSizeMake(111, 111) forKey:@"size"]; 49 | 50 | [dict setRect:CGRectMake(0, 0, 0, 0) forKey:@"rect"]; 51 | 52 | ##更多Catgories 53 | https://github.com/shaojiankui/IOS-Categories 54 | --------------------------------------------------------------------------------