You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
4.5 KiB
172 lines
4.5 KiB
// |
|
// NSArray+YYAdd.m |
|
// YYKit <https://github.com/ibireme/YYKit> |
|
// |
|
// 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 "YYKitMacro.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 = nil; |
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error]; |
|
NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; |
|
if (!error) return json; |
|
} |
|
return nil; |
|
} |
|
|
|
- (NSString *)jsonPrettyStringEncoded { |
|
if ([NSJSONSerialization isValidJSONObject:self]) { |
|
NSError *error = nil; |
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; |
|
NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; |
|
if (!error) 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
|
|
|