NSArray-Addtions.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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)objectInSubArrays:(NSString *)description as:(id)aObject {
  29. id robject = nil;
  30. for (id object in self) {
  31. if (description && [description isKindOfClass:[NSString class]]) {
  32. //make selector
  33. SEL selector = NSSelectorFromString(description);
  34. #pragma clang diagnostic push
  35. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  36. //get sub array
  37. NSArray *subarray = [object performSelector:selector];
  38. #pragma clang diagnostic pop
  39. //find associated object from subArray
  40. for (id subObject in subarray) {
  41. if ([subObject isEqual:aObject]) {
  42. robject = subObject;
  43. break;
  44. }
  45. }
  46. }
  47. if (robject) {
  48. break;
  49. }
  50. }
  51. return robject;
  52. }
  53. - (id)matchedObjectName:(NSString *)objectName condition:(BOOL)condition {
  54. id matchedObject = nil;
  55. for (id object in self) {
  56. id associatedObj = objc_getAssociatedObject(object, (__bridge const void *)(objectName));
  57. if ([associatedObj boolValue] == condition) {
  58. matchedObject = object;
  59. break;
  60. }
  61. }
  62. return matchedObject;
  63. }
  64. - (NSArray *)matchedArrayInSubArrays:(id)description objectName:(NSString *)objectName condition:(BOOL)condition {
  65. NSMutableArray *marray = [[NSMutableArray alloc] init];
  66. for (id object in self) {
  67. if (description && [description isKindOfClass:[NSString class]]) {
  68. //make selector
  69. SEL selector = NSSelectorFromString(description);
  70. #pragma clang diagnostic push
  71. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  72. //get sub array
  73. NSArray *subarray = [object performSelector:selector];
  74. #pragma clang diagnostic pop
  75. //find associated object from subArray
  76. id matchedObject = [subarray matchedObjectName:objectName condition:condition];
  77. if (matchedObject) {
  78. [marray addObject:matchedObject];
  79. }
  80. }
  81. }
  82. return marray;
  83. }
  84. - (NSArray *)matchedArrayInSubArrays:(id)description predicateFormat:(NSString *)format, ... {
  85. va_list args;
  86. va_start(args, format);
  87. NSPredicate *pred = [NSPredicate predicateWithFormat:format arguments:args];
  88. return [self matchedArrayInSubArrays:description predicate:pred];
  89. }
  90. - (NSArray *)matchedArrayInSubArrays:(id)description predicate:(NSPredicate *)pred {
  91. NSMutableArray *marray = [[NSMutableArray alloc] init];
  92. for (id object in self) {
  93. if (description && [description isKindOfClass:[NSString class]]) {
  94. SEL selector = NSSelectorFromString(description);
  95. #pragma clang diagnostic push
  96. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  97. NSArray *subarray = [object performSelector:selector];
  98. #pragma clang diagnostic pop
  99. NSArray *filteredArray = nil;
  100. @try {
  101. filteredArray = [subarray filteredArrayUsingPredicate:pred];
  102. if (filteredArray && filteredArray.count) {
  103. [marray addObjectsFromArray:filteredArray];
  104. }
  105. }
  106. @catch (NSException *exception) {
  107. continue;
  108. }
  109. } else if ([object isKindOfClass:[NSArray class]]) {
  110. NSArray *array = object;
  111. NSArray *filteredArray = [array filteredArrayUsingPredicate:pred];
  112. [marray addObjectsFromArray:filteredArray];
  113. } else if ([object isKindOfClass:[NSDictionary class]]) {
  114. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, object);
  115. }
  116. }
  117. return marray;
  118. }
  119. - (NSArray *)filteredArrayUsingPredicateFormat:(NSString *)format, ... {
  120. va_list args;
  121. va_start(args, format);
  122. NSPredicate *pred = [NSPredicate predicateWithFormat:format arguments:args];
  123. return [self filteredArrayUsingPredicate:pred];
  124. }
  125. @end