NSArray的Category
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的更多相关文章
- 将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)
- (NSArray *)testa:(NSDictionary *)dic { NSMutableArray *arr_M = [NSMutableArray array]; // 1.遍历每一个元 ...
- 一段可以清理NSArray中的空对象的代码(递归)
- (NSArray *)clearAllNullObject{ NSMutableArray *array = [self mutableCopy]; ;i < array.count;i++ ...
- Objective-c防止数组越界而崩溃(全局效果)
数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so ..runtime&c ...
- NSString,NSArray,NSNumber等类的继承问题
问题引入,我想给NSString类扩展一些新的方法.在Objective-C中可以有两种方法,一是继承,二是类别.本文先不讨论类别,我们用继承的方法试一下: @interface StringEx : ...
- App开发流程之使用分类(Category)和忽略编译警告(Warning)
Category使得开发过程中,减少了继承的使用,避免子类层级的膨胀.合理使用,可以在不侵入原类代码的基础上,写出漂亮的扩展内容.我更习惯称之为"分类". Category和Ext ...
- 【原】iOS动态性(一):动态添加属性的方法——关联(e.g. 向Category添加属性)
想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative ...
- iOS/Objective-C开发 字典NSDictionary的深复制(使用category)
目标:把NSDictionary对象转换成NSMutableDictionary对象,对象内容是字符串数组,需要实现完全复制(深复制). 如果调用NSDictionary的mutableCopy方法, ...
- 关于delegate, category和subclass
因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在cocoa中很重要时,我便更糊涂了…或许从C++或者Java转过来的高手一看就明白,所以高手您随便拍砖,指正我的错误:新手 ...
- [置顶] What is the difference between Category and Class Extension?
细心的人会发现当我们new 一个文件的时候会发现下图的部分. 但是这个问题来了Category 和 Extension 就近又什么区别呢? 1:什么是Category? 实现这样一种场景,当我们用我们 ...
随机推荐
- ecshop的smarty库还原成smarty原生库方法
写过ecshop模板的人都晓得,他们是用所谓的dwt的文件来嵌套lbi文件进行模板的彼此调用.在咱们调取数据的时分,ecshop的默许模板只提供给咱们几个简略的句子进行调用,那么有没有办法能够把这个精 ...
- PS常见错误-无法完成请求,因为文件格式模块不能解析该文件
无法完成请求,因为文件格式模块不能解析该文件 将图片格式变成.jpg格式就可以了
- Codeforces Round #115 A. Robot Bicorn Attack 暴力
A. Robot Bicorn Attack Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/17 ...
- BZOJ 1051: [HAOI2006]受欢迎的牛 缩点
1051: [HAOI2006]受欢迎的牛 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- Java多线程模式(二)
Guarded Suspension Pattern 该模式描述的是当一个线程在执行某个操作时,但由于其他资源还没有准备好,需要等待,那么就等待资源准备好才开始自己的操作.我们直接看代码例子 ...
- libIconv.lib编码库的生成和使用
iconv是将一种编码格式转换为另一种编码格式的开源库,例如可以把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码 iconv最新版本只支持MingW和 ...
- HDU 4293 Groups (线性dp)
OJ题目:click here~~ 题目分析:n个人分为若干组 , 每一个人描写叙述其所在的组前面的人数和后面的人数.求这n个描写叙述中,最多正确的个数. 设dp[ i ] 为前i个人的描写叙述中最多 ...
- Android源码编译的全过程记录
写本篇文章主要参考了官方文档和网上的一些资料,但是对于Android最新的代码来说,网上资料有些已经过时.本文中步骤已经作者实验,大家可以亲自执行试试.由于没有使用Eclipse的习惯,所以没有做Ec ...
- [Angular 2] More on *ngFor, @ContentChildren & QueryList<>
In previous artical, we introduce the how to use *ngFor. The limitation for previous solution to dis ...
- Metadata Lock原理4
http://blog.chinaunix.net/uid-28212952-id-3400571.html Alibaba 今天发生一个故障,MM复制结构(主备库),备库slave del ...