New file |
| | |
| | | // |
| | | // NSArray+YYAdd.m |
| | | // YYCategories <https://github.com/ibireme/YYCategories> |
| | | // |
| | | // Created by ibireme on 13/4/4. |
| | | // Copyright (c) 2015 ibireme. |
| | | // |
| | | // This source code is licensed under the MIT-style license found in the |
| | | // LICENSE file in the root directory of this source tree. |
| | | // |
| | | |
| | | #import "NSArray+YYAdd.h" |
| | | #import "YYCategoriesMacro.h" |
| | | #import "NSData+YYAdd.h" |
| | | |
| | | YYSYNTH_DUMMY_CLASS(NSArray_YYAdd) |
| | | |
| | | |
| | | @implementation NSArray (YYAdd) |
| | | |
| | | + (NSArray *)arrayWithPlistData:(NSData *)plist { |
| | | if (!plist) return nil; |
| | | NSArray *array = [NSPropertyListSerialization propertyListWithData:plist options:NSPropertyListImmutable format:NULL error:NULL]; |
| | | if ([array isKindOfClass:[NSArray class]]) return array; |
| | | return nil; |
| | | } |
| | | |
| | | + (NSArray *)arrayWithPlistString:(NSString *)plist { |
| | | if (!plist) return nil; |
| | | NSData* data = [plist dataUsingEncoding:NSUTF8StringEncoding]; |
| | | return [self arrayWithPlistData:data]; |
| | | } |
| | | |
| | | - (NSData *)plistData { |
| | | return [NSPropertyListSerialization dataWithPropertyList:self format:NSPropertyListBinaryFormat_v1_0 options:kNilOptions error:NULL]; |
| | | } |
| | | |
| | | - (NSString *)plistString { |
| | | NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:self format:NSPropertyListXMLFormat_v1_0 options:kNilOptions error:NULL]; |
| | | if (xmlData) return xmlData.utf8String; |
| | | return nil; |
| | | } |
| | | |
| | | - (id)randomObject { |
| | | if (self.count) { |
| | | return self[arc4random_uniform((u_int32_t)self.count)]; |
| | | } |
| | | return nil; |
| | | } |
| | | |
| | | - (id)objectOrNilAtIndex:(NSUInteger)index { |
| | | return index < self.count ? self[index] : nil; |
| | | } |
| | | |
| | | - (NSString *)jsonStringEncoded { |
| | | if ([NSJSONSerialization isValidJSONObject:self]) { |
| | | NSError *error; |
| | | NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error]; |
| | | NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; |
| | | return json; |
| | | } |
| | | return nil; |
| | | } |
| | | |
| | | - (NSString *)jsonPrettyStringEncoded { |
| | | if ([NSJSONSerialization isValidJSONObject:self]) { |
| | | NSError *error; |
| | | NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; |
| | | NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; |
| | | return json; |
| | | } |
| | | return nil; |
| | | } |
| | | |
| | | @end |
| | | |
| | | |
| | | |
| | | @implementation NSMutableArray (YYAdd) |
| | | |
| | | + (NSMutableArray *)arrayWithPlistData:(NSData *)plist { |
| | | if (!plist) return nil; |
| | | NSMutableArray *array = [NSPropertyListSerialization propertyListWithData:plist options:NSPropertyListMutableContainersAndLeaves format:NULL error:NULL]; |
| | | if ([array isKindOfClass:[NSMutableArray class]]) return array; |
| | | return nil; |
| | | } |
| | | |
| | | + (NSMutableArray *)arrayWithPlistString:(NSString *)plist { |
| | | if (!plist) return nil; |
| | | NSData* data = [plist dataUsingEncoding:NSUTF8StringEncoding]; |
| | | return [self arrayWithPlistData:data]; |
| | | } |
| | | |
| | | - (void)removeFirstObject { |
| | | if (self.count) { |
| | | [self removeObjectAtIndex:0]; |
| | | } |
| | | } |
| | | |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" |
| | | - (void)removeLastObject { |
| | | if (self.count) { |
| | | [self removeObjectAtIndex:self.count - 1]; |
| | | } |
| | | } |
| | | |
| | | #pragma clang diagnostic pop |
| | | |
| | | |
| | | - (id)popFirstObject { |
| | | id obj = nil; |
| | | if (self.count) { |
| | | obj = self.firstObject; |
| | | [self removeFirstObject]; |
| | | } |
| | | return obj; |
| | | } |
| | | |
| | | - (id)popLastObject { |
| | | id obj = nil; |
| | | if (self.count) { |
| | | obj = self.lastObject; |
| | | [self removeLastObject]; |
| | | } |
| | | return obj; |
| | | } |
| | | |
| | | - (void)appendObject:(id)anObject { |
| | | [self addObject:anObject]; |
| | | } |
| | | |
| | | - (void)prependObject:(id)anObject { |
| | | [self insertObject:anObject atIndex:0]; |
| | | } |
| | | |
| | | - (void)appendObjects:(NSArray *)objects { |
| | | if (!objects) return; |
| | | [self addObjectsFromArray:objects]; |
| | | } |
| | | |
| | | - (void)prependObjects:(NSArray *)objects { |
| | | if (!objects) return; |
| | | NSUInteger i = 0; |
| | | for (id obj in objects) { |
| | | [self insertObject:obj atIndex:i++]; |
| | | } |
| | | } |
| | | |
| | | - (void)insertObjects:(NSArray *)objects atIndex:(NSUInteger)index { |
| | | NSUInteger i = index; |
| | | for (id obj in objects) { |
| | | [self insertObject:obj atIndex:i++]; |
| | | } |
| | | } |
| | | |
| | | - (void)reverse { |
| | | NSUInteger count = self.count; |
| | | int mid = floor(count / 2.0); |
| | | for (NSUInteger i = 0; i < mid; i++) { |
| | | [self exchangeObjectAtIndex:i withObjectAtIndex:(count - (i + 1))]; |
| | | } |
| | | } |
| | | |
| | | - (void)shuffle { |
| | | for (NSUInteger i = self.count; i > 1; i--) { |
| | | [self exchangeObjectAtIndex:(i - 1) |
| | | withObjectAtIndex:arc4random_uniform((u_int32_t)i)]; |
| | | } |
| | | } |
| | | |
| | | @end |