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? 实现这样一种场景,当我们用我们 ...
随机推荐
- 用shader使图片背景透明
转自:http://blog.csdn.net/dawn_moon/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些图都有个 ...
- ListView上移 和下移
有问题 //ListBox选中的项目移动到第1位 Listbox1.Items.Move(ListBox1.ItemIndex,0); //ListView选中的项目移动到第1 ...
- 将PHP作为Shell脚本语言使用
我们都知道.PHP是一种非常好的动态网页开发语言(速度飞快.开发周期短--).可是仅仅有非常少数的人意识到PHP也能够非常好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并 ...
- 我总结的18个非常好用的vim指令
在Linux下最有名的程序编辑器非vim莫属了. 在一般模式下, 1.dd——删除光标所在行 2./word ——全文搜索指定单词 3.G ——将光标移动到文件的最后一行,移动到第99行,就是99G ...
- [MEAN Stack] First API -- 5. Using $resource to setup REST app
Front-end changes: app.js: Uinsg $resource /** * Created by Answer1215 on 12/9/2014. */ 'use strict' ...
- Android进阶2之APK方式换肤
public class MainActivity extends Activity { private Button defaultbutton = null; @Override public v ...
- VBA Excel 单元格操作
1. 设置单元格边框: .Range("A3:M" & l + 1).SelectWith Selection.Borders() .LineStyle = xlConti ...
- Linux内核加载全流程
无论是Linux还是Windows,在加电后的第一步都是先运行BIOS(Basic Input/Output System)程序——不知道是不是所以的电脑系统都是如此.BIOS保存在主板上的一个non ...
- cocos2d-x lua 实现单例(管理类)
cocos2d-x lua 实现单例(管理类) version: cocos2d-x 3.6 示例代码 local DogManager = class("DogManager") ...
- OPENSSL安装 以及使用openssl中的AES加密和解密
OPENSSL安装:(VS) 1:第一步和所有的软件安装一样. 2:将OPENSSL中INLUCDE 和 LIB 分别拷贝到VS中VC的INLUCDE 和LIB目录下(我的机器上的目录是:C:\Pro ...