123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- //
- // 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
|