NSArray-Addtions.m 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. //
  2. // NSArray-Addtions.m
  3. // JasonDevelop
  4. //
  5. // Created by Jason Lee on 10/29/14.
  6. // Copyright (c) jasondevelop. All rights reserved.
  7. //
  8. @import ObjectiveC.runtime;
  9. #import "NSArray-Addtions.h"
  10. @implementation NSArray (Addtions)
  11. - (NSString*)jsonStringWithPrettyPrint:(BOOL) prettyPrint {
  12. NSError *error;
  13. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self
  14. options:(NSJSONWritingOptions) (prettyPrint ? NSJSONWritingPrettyPrinted : 0)
  15. error:&error];
  16. if (!jsonData) {
  17. NSLog(@"bv_jsonStringWithPrettyPrint: error: %@", error.localizedDescription);
  18. return @"[]";
  19. } else {
  20. return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  21. }
  22. }
  23. - (id)objectKey:(NSString *)key eqaulToString:(NSString *)aString {
  24. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF.%@ == %@", key, aString];
  25. NSArray *filteredArray = [self filteredArrayUsingPredicate:pred];
  26. return filteredArray && filteredArray.count ? filteredArray[0] : nil;
  27. }
  28. - (id)objectByUsingPredicateFormat:(NSString *)format, ... {
  29. va_list args;
  30. va_start(args, format);
  31. NSPredicate *pred = [NSPredicate predicateWithFormat:format arguments:args];
  32. NSArray *filteredArray = [self filteredArrayUsingPredicate:pred];
  33. return filteredArray && filteredArray.count ? filteredArray[0] : nil;
  34. }
  35. - (id)objectInSubArrays:(NSString *)description as:(id)aObject {
  36. id robject = nil;
  37. for (id object in self) {
  38. if (description && [description isKindOfClass:[NSString class]]) {
  39. //make selector
  40. SEL selector = NSSelectorFromString(description);
  41. #pragma clang diagnostic push
  42. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  43. //get sub array
  44. NSArray *subarray = [object performSelector:selector];
  45. #pragma clang diagnostic pop
  46. //find associated object from subArray
  47. for (id subObject in subarray) {
  48. if ([subObject isEqual:aObject]) {
  49. robject = subObject;
  50. break;
  51. }
  52. }
  53. }
  54. if (robject) {
  55. break;
  56. }
  57. }
  58. return robject;
  59. }
  60. - (id)matchedObjectName:(NSString *)objectName condition:(BOOL)condition {
  61. id matchedObject = nil;
  62. for (id object in self) {
  63. id associatedObj = objc_getAssociatedObject(object, (__bridge const void *)(objectName));
  64. if ([associatedObj boolValue] == condition) {
  65. matchedObject = object;
  66. break;
  67. }
  68. }
  69. return matchedObject;
  70. }
  71. - (NSArray *)matchedArrayByObjectName:(NSString *)objectName condition:(BOOL)condition {
  72. NSMutableArray *marray = [[NSMutableArray alloc] init];
  73. for (id object in self) {
  74. id associatedObj = objc_getAssociatedObject(object, (__bridge const void *)(objectName));
  75. if ([associatedObj boolValue] == condition) {
  76. [marray addObject:object];
  77. }
  78. }
  79. return marray;
  80. }
  81. - (NSArray *)matchedArrayInSubArrays:(id)description objectName:(NSString *)objectName condition:(BOOL)condition {
  82. NSMutableArray *marray = [[NSMutableArray alloc] init];
  83. for (id object in self) {
  84. if (description && [description isKindOfClass:[NSString class]]) {
  85. //make selector
  86. SEL selector = NSSelectorFromString(description);
  87. #pragma clang diagnostic push
  88. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  89. //get sub array
  90. NSArray *subarray = [object performSelector:selector];
  91. #pragma clang diagnostic pop
  92. //find associated object from subArray
  93. id matchedObject = [subarray matchedObjectName:objectName condition:condition];
  94. if (matchedObject) {
  95. [marray addObject:matchedObject];
  96. }
  97. }
  98. }
  99. return marray;
  100. }
  101. - (NSArray *)matchedArrayInSubArrays:(id)description predicateFormat:(NSString *)format, ... {
  102. va_list args;
  103. va_start(args, format);
  104. NSPredicate *pred = [NSPredicate predicateWithFormat:format arguments:args];
  105. return [self matchedArrayInSubArrays:description predicate:pred];
  106. }
  107. - (NSArray *)matchedArrayInSubArrays:(id)description predicate:(NSPredicate *)pred {
  108. NSMutableArray *marray = [[NSMutableArray alloc] init];
  109. for (id object in self) {
  110. if (description && [description isKindOfClass:[NSString class]]) {
  111. SEL selector = NSSelectorFromString(description);
  112. #pragma clang diagnostic push
  113. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  114. NSArray *subarray = [object performSelector:selector];
  115. #pragma clang diagnostic pop
  116. NSArray *filteredArray = nil;
  117. @try {
  118. filteredArray = [subarray filteredArrayUsingPredicate:pred];
  119. if (filteredArray && filteredArray.count) {
  120. [marray addObjectsFromArray:filteredArray];
  121. }
  122. }
  123. @catch (NSException *exception) {
  124. continue;
  125. }
  126. } else if ([object isKindOfClass:[NSArray class]]) {
  127. NSArray *array = object;
  128. NSArray *filteredArray = [array filteredArrayUsingPredicate:pred];
  129. [marray addObjectsFromArray:filteredArray];
  130. } else if ([object isKindOfClass:[NSDictionary class]]) {
  131. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, object);
  132. }
  133. }
  134. return marray;
  135. }
  136. - (NSArray *)filteredArrayUsingPredicateFormat:(NSString *)format, ... {
  137. va_list args;
  138. va_start(args, format);
  139. NSPredicate *pred = [NSPredicate predicateWithFormat:format arguments:args];
  140. return [self filteredArrayUsingPredicate:pred];
  141. }
  142. @end