NSArray的Category

前言

项目中自己通过各种渠道及结合项目的经验整理了一套自己的工具包,里面有各种Category,及封装的方法,方便项目使用,今天先分享一下NSarray的Category。

NSArray+LSCore.h

#import <Foundation/Foundation.h>

@interface NSArray (LSCore)

#pragma mark - 取值
- (id)firstObject;
- (id)randomObject; #pragma mark - 排序
- (NSArray *)shuffledArray;
- (NSArray *)reversedArray;
- (NSArray *)uniqueArray;
- (NSArray *)arraySorting:(NSString *)parameters ascending:(BOOL)ascending; #pragma mark - 安全操作
-(id)objectWithIndex:(NSUInteger)index; - (NSString*)stringWithIndex:(NSUInteger)index;
- (NSNumber*)numberWithIndex:(NSUInteger)index;
- (NSArray*)arrayWithIndex:(NSUInteger)index;
- (NSDictionary*)dictionaryWithIndex:(NSUInteger)index;
- (NSInteger)integerWithIndex:(NSUInteger)index;
- (NSUInteger)unsignedIntegerWithIndex:(NSUInteger)index;
- (BOOL)boolWithIndex:(NSUInteger)index; - (int16_t)int16WithIndex:(NSUInteger)index;
- (int32_t)int32WithIndex:(NSUInteger)index;
- (int64_t)int64WithIndex:(NSUInteger)index; - (char)charWithIndex:(NSUInteger)index;
- (short)shortWithIndex:(NSUInteger)index;
- (float)floatWithIndex:(NSUInteger)index;
- (double)doubleWithIndex:(NSUInteger)index; - (CGFloat)CGFloatWithIndex:(NSUInteger)index;
- (CGPoint)pointWithIndex:(NSUInteger)index;
- (CGSize)sizeWithIndex:(NSUInteger)index;
- (CGRect)rectWithIndex:(NSUInteger)index; @end

NSArray+LSCore.m

#import "NSArray+LSCore.h"

@implementation NSArray (LSCore)
#pragma mark - 取值
/**
* 获取数组的第一个元素
*
* @return 取得的元素
*/
- (id)firstObject {
if ([self count] > 0) {
return [self objectAtIndex:0];
} else {
return nil;
}
} /**
* 随机取数组里的一个元素
*
* @return 随机取得的元素
*/
- (id)randomObject {
if ([self count] > 0) {
int index = arc4random() % [self count];
id object = [self objectAtIndex:index];
return object;
} else {
return nil;
}
} #pragma mark - 排序
/**
* 重组数组(打乱顺序)
*
* @return 重组之后的数组
*/
- (NSArray *)shuffledArray {
NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count]];
NSMutableArray *copy = [self mutableCopy];
while ([copy count] > 0)
{
int index = arc4random() % [copy count];
id objectToMove = [copy objectAtIndex:index];
[array addObject:objectToMove];
[copy removeObjectAtIndex:index];
}
return array;
} /**
* 数组倒序
*
* @return 将数组倒序后得到的数组
*/
- (NSArray *)reversedArray {
NSArray *reversedArray = [[self reverseObjectEnumerator] allObjects];
return reversedArray;
} /**
* 数组去除相同的元素,并获得新的array
*
* @return 去除相同元素后的array
*/
- (NSArray *)uniqueArray {
NSSet *set = [NSSet setWithArray:self];
NSArray *array = [[NSArray alloc] initWithArray:[set allObjects]];
return array;
} /**
* 根据关键词 对array的内容进行排序,并返回排序后的array
*
* @param parameters 关键词
* @param ascending YES 升序 NO 降序
*
* @return 经过排序后的数组
*/
- (NSArray *)arraySorting:(NSString *)parameters ascending:(BOOL)ascending {
NSSortDescriptor*sorter=[[NSSortDescriptor alloc]initWithKey:parameters ascending:ascending];
NSMutableArray *sortDescriptors=[[NSMutableArray alloc]initWithObjects:&sorter count:1];
NSArray *sortArray=[self sortedArrayUsingDescriptors:sortDescriptors];
return sortArray;
} #pragma mark - 安全操作
/**
* 获取下标为index的对象
*
* @param index 下标
*
* @return 获得的对象
*/
-(id)objectWithIndex:(NSUInteger)index {
if (index <self.count) {
return self[index];
}else{
return nil;
}
} /**
* 获取下标为index的字符串,不存在返回空,能转为string的转,不能的返回nil
*
* @param index 下标
*
* @return 获得的字符串
*/
- (NSString*)stringWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index];
if (value == nil || value == [NSNull null])
{
return @"";
}
if ([value isKindOfClass:[NSString class]]) {
return (NSString*)value;
}
if ([value isKindOfClass:[NSNumber class]]) {
return [value stringValue];
} return nil;
} /**
* 获取下标为index的number,不存在返回空,能转为number的转,不能的返回nil
*
* @param index 下标
*
* @return 获得的number
*/
- (NSNumber*)numberWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index];
if ([value isKindOfClass:[NSNumber class]]) {
return (NSNumber*)value;
}
if ([value isKindOfClass:[NSString class]]) {
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
return [f numberFromString:(NSString*)value];
}
return nil;
} /**
* 获取下标为index的array,不存返回nil
*
* @param index 下标
*
* @return 获得的array
*/
- (NSArray*)arrayWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index];
if (value == nil || value == [NSNull null])
{
return nil;
}
if ([value isKindOfClass:[NSArray class]])
{
return value;
}
return nil;
} /**
* 获取下标为index的Dictionary,不存返回nil
*
* @param index 下标
*
* @return 获得的Dictionary
*/
- (NSDictionary*)dictionaryWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index];
if (value == nil || value == [NSNull null])
{
return nil;
}
if ([value isKindOfClass:[NSDictionary class]])
{
return value;
}
return nil;
} /**
* 获取下标为index的integer,不存返回0
*
* @param index 下标
*
* @return 获得的integer
*/
- (NSInteger)integerWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index];
if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]])
{
return [value integerValue];
}
return 0;
} /**
* 获取下标为index的unsignedInteger,不存返回0
*
* @param index 下标
*
* @return 获得的unsignedInteger
*/
- (NSUInteger)unsignedIntegerWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index];
if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]])
{
return [value unsignedIntegerValue];
}
return 0;
} /**
* 获取下标为index的bool,不存返回NO
*
* @param index 下标
*
* @return 获得的bool
*/
- (BOOL)boolWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return NO;
}
if ([value isKindOfClass:[NSNumber class]])
{
return [value boolValue];
}
if ([value isKindOfClass:[NSString class]])
{
return [value boolValue];
}
return NO;
} /**
* 获取下标为index的int16,不存返回0
*
* @param index 下标
*
* @return 获得的int16
*/
- (int16_t)int16WithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]])
{
return [value shortValue];
}
if ([value isKindOfClass:[NSString class]])
{
return [value intValue];
}
return 0;
} /**
* 获取下标为index的int32,不存返回0
*
* @param index 下标
*
* @return 获得的int32
*/
- (int32_t)int32WithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]])
{
return [value intValue];
}
return 0;
} /**
* 获取下标为index的int64,不存返回0
*
* @param index 下标
*
* @return 获得的int64
*/
- (int64_t)int64WithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]])
{
return [value longLongValue];
}
return 0;
} /**
* 获取下标为index的charValue,不存返回0
*
* @param index 下标
*
* @return 获得的charValue
*/
- (char)charWithIndex:(NSUInteger)index { id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]])
{
return [value charValue];
}
return 0;
} /**
* 获取下标为index的intValue,不存返回0
*
* @param index 下标
*
* @return 获得的intValue
*/
- (short)shortWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]])
{
return [value shortValue];
}
if ([value isKindOfClass:[NSString class]])
{
return [value intValue];
}
return 0;
} /**
* 获取下标为index的floatValue,不存返回0
*
* @param index 下标
*
* @return 获得的floatValue
*/
- (float)floatWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]])
{
return [value floatValue];
}
return 0;
} /**
* 获取下标为index的doubleValue,不存返回0
*
* @param index 下标
*
* @return 获得的doubleValue
*/
- (double)doubleWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; if (value == nil || value == [NSNull null])
{
return 0;
}
if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]])
{
return [value doubleValue];
}
return 0;
} /**
* 获取下标为index的CGFloat
*
* @param index 下标
*
* @return 获得的CGFloat
*/
- (CGFloat)CGFloatWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; CGFloat f = [value doubleValue]; return f;
} /**
* 获取下标为index的point
*
* @param index 下标
*
* @return 获得的point
*/
- (CGPoint)pointWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; CGPoint point = CGPointFromString(value); return point;
} /**
* 获取下标为index的size
*
* @param index 下标
*
* @return 获得的size
*/
- (CGSize)sizeWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; CGSize size = CGSizeFromString(value); return size;
} /**
* 获取下标为index的rect
*
* @param index 下标
*
* @return 获得的rect
*/
- (CGRect)rectWithIndex:(NSUInteger)index {
id value = [self objectWithIndex:index]; CGRect rect = CGRectFromString(value); return rect;
} @end

NSArray的Category的更多相关文章

  1. 将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)

    - (NSArray *)testa:(NSDictionary *)dic { NSMutableArray *arr_M = [NSMutableArray array]; // 1.遍历每一个元 ...

  2. 一段可以清理NSArray中的空对象的代码(递归)

    - (NSArray *)clearAllNullObject{ NSMutableArray *array = [self mutableCopy]; ;i < array.count;i++ ...

  3. Objective-c防止数组越界而崩溃(全局效果)

    数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so ..runtime&c ...

  4. NSString,NSArray,NSNumber等类的继承问题

    问题引入,我想给NSString类扩展一些新的方法.在Objective-C中可以有两种方法,一是继承,二是类别.本文先不讨论类别,我们用继承的方法试一下: @interface StringEx : ...

  5. App开发流程之使用分类(Category)和忽略编译警告(Warning)

    Category使得开发过程中,减少了继承的使用,避免子类层级的膨胀.合理使用,可以在不侵入原类代码的基础上,写出漂亮的扩展内容.我更习惯称之为"分类". Category和Ext ...

  6. 【原】iOS动态性(一):动态添加属性的方法——关联(e.g. 向Category添加属性)

    想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative ...

  7. iOS/Objective-C开发 字典NSDictionary的深复制(使用category)

    目标:把NSDictionary对象转换成NSMutableDictionary对象,对象内容是字符串数组,需要实现完全复制(深复制). 如果调用NSDictionary的mutableCopy方法, ...

  8. 关于delegate, category和subclass

    因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在cocoa中很重要时,我便更糊涂了…或许从C++或者Java转过来的高手一看就明白,所以高手您随便拍砖,指正我的错误:新手 ...

  9. [置顶] What is the difference between Category and Class Extension?

    细心的人会发现当我们new 一个文件的时候会发现下图的部分. 但是这个问题来了Category 和 Extension 就近又什么区别呢? 1:什么是Category? 实现这样一种场景,当我们用我们 ...

随机推荐

  1. iOS 小知识-tips

    --->1<--- arc的项目中使用非arc代码,则添加-fno-objc-arc: 非arc项目中使用arc代码,则添加-fobjc-arc. --->2<--- 实用的类 ...

  2. ADO.NET 快速入门(十一):连接池

    这个示例演示了如何构建一个到数据源的连接池.你可以通过连接池部署高性能的应用程序.本例中使用连接串创建连接池,并且由 SqlConnection 自动管理.   string connString; ...

  3. Hash Table构建

    get-item e:\test\* |format-table @{name="aa";expression={$_.name.tostring().split(".& ...

  4. 根据条件自定义 cxGrid 的单元格样式

    当指定的单元格需要指定样式(如字体颜色设置为红色,背景色设置为黄色)时,可按如下步骤进行: 1.添加 csStyleRepository 控件,并新建 Style,设置前景(TextColor).背景 ...

  5. STM8的wait for interrupt

    如果我用disable interrupt和enable interrupt包裹wait forinterrupt(WFI).你说WFI还能被唤醒么?有思考过么? 昨晚拿STM8L151K4的开发板, ...

  6. Lua学习教程之 可变參数数据打包与解包

    利用table的pack与unpack进行数据打包与解包.測试代码例如以下: print("Test table.pack()----------------"); functio ...

  7. 图的深度优先搜索算法DFS

    1.问题描写叙述与理解 深度优先搜索(Depth First Search.DFS)所遵循的策略.如同其名称所云.是在图中尽可能"更深"地进行搜索. 在深度优先搜索中,对最新发现的 ...

  8. 架构师之路(39)---IoC框架

    1 IoC理论的背景     我们都知道,在採用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,全部的对象通过彼此的合作,终于实现系统的业务逻辑.   图1:软件系统中耦合的对象 假设 ...

  9. 第一周:读取XML深度数据并将其重建为三维点云

    本周主要任务:学习PCL点云库,掌握利用PCL对点云处理的方法 任务时间:2014年9月1日-2014年9月7日 任务完成情况:完成了读取单幅xml深度数据,并重建三维点云并显示 任务涉及基本方法: ...

  10. js new date详解

    创建一个日期对象: var objDate=new Date([arguments list]); var ini_date=new Date(2014,7,0); //是代表7月最后一天 ,也就是2 ...