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? 实现这样一种场景,当我们用我们 ...
随机推荐
- DataGridView单元格合并
本文章转载:http://www.cnblogs.com/xiaofengfeng/p/3382094.html 图: 代码就是如此简单 文件下载:DataGridView单元格合并源码 也可以参考: ...
- DuiLib(三)——控件消息
上一篇讲了控件创建,这篇说说控件消息.directui的中心思想是在真实窗口之上画出所有控件,那这些控件是如何获取各自消息的? 通过第一篇的示例可以看到窗口消息的传递过程: CWindowWnd::_ ...
- ZJU-PAT 1065. A+B and C (64bit) (20)
Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...
- oc-10-对象做参数
// // main.m // 6-[掌握]对象和方法之间的关系 #import <Foundation/Foundation.h> //声明人类 @interface Person : ...
- _vsnprintf 用法
_vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 头文件: #include <stdarg.h> 函数声明: int _vsnprint ...
- 十六款值得关注的NoSQL与NewSQL数据库--转载
原文地址:http://tech.it168.com/a2014/0929/1670/000001670840_all.shtml [IT168 评论]传统关系型数据库在诞生之时并未考虑到如今如火如荼 ...
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转
TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...
- css预处理的引入与问题
css的预处理越来越流行.sass,less,stylus这几个都使用方便. 我想使用他的原因,暂时最主要是为了@import的功能.现在的问题:因为产品太多,是个页面,有10个css.而这10个cs ...
- Qt 显示透明flash和编写QtWebkit插件
Qt 有两种方法可以显示flash. 1. 通过QAxWidget 调用com形式显示flash, 需要本机安装IE flash插件 2. 直接通过qwebview显示flash, 需要下载webki ...
- Socket的使用
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import jav ...