OC基础:NSArray

NSArray,数组,用于管理对象的有序集合。
NSArray的用法总结如下:

1.数组的工厂方法创建:

#pragma mark 创建(+)
-(void)Creating
{
    // 空数组
    NSArray *array = [NSArray array];
    
    // 根据数组创建数组
    array = [NSArray arrayWithArray:array];
    
    // 从文件获取
    NSString *filePath = [self testData];
    array = [NSArray arrayWithContentsOfFile:filePath];
    array = [NSArray arrayWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
    
    // 包含一个数据的数组
    array = [NSArray arrayWithObject:@"Hello"];
    
    // 包含多个数据的数组
    array = [NSArray arrayWithObjects:@"Hello", @"World", nil];
}

2.数组初始化创建:

#pragma mark 初始化(-)
-(void)Initializing
{
    // 空数组
    NSArray *array = [[NSArray alloc]init];
    
    // 根据数组创建数组
    array = [[NSArray alloc] initWithArray:array];
    array = [[NSArray alloc] initWithArray:array copyItems:YES];
    
    // 从文件获取
    NSString *filePath = [self testData];
    array = [[NSArray alloc] initWithContentsOfFile:filePath];
    array = [[NSArray alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
    
    // 包含多个数据的数组
    array = [[NSArray alloc] initWithObjects:@"Hello",@"World", nil];
}

3.数组查询

#pragma mark 查询
-(void)Querying
{
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World", nil];
    
    //数组中是否包含某个数据
    BOOL isContains = [array containsObject:@"Hello"];
    NSLog(@"containsObject:%d",isContains);
    
    // 数组长度
    NSInteger count = [array count]; // 数组长度
    NSLog(@"count:%ld", (long)count);
    
    //第一个数据
    id str = array.firstObject;
    
    //最后一个数据
    str = array.lastObject;
    
    // 取第0个位置的数据
    str = [array objectAtIndex:0];
    
    // 取第0个位置的数据
    str = [array objectAtIndexedSubscript:0];
    
    // 取第0个位置的数据
    str = array[0];
    
    // 遍历
    NSEnumerator *enumerator = [array objectEnumerator];
    id anObject;
    while (anObject = [enumerator nextObject]) {
        NSLog(@"objectEnumerator:%@", anObject);
    }
    
    enumerator = [array reverseObjectEnumerator];
    while (anObject = [enumerator nextObject]) {
        NSLog(@"reverseObjectEnumerator:%@", anObject);
    }
    
    // 快速遍历
    for (anObject in array) {
        NSLog(@"forIn:%@", anObject);
    }
}

4.数组查找对象位置

#pragma mark 查找对象位置
-(void)FindingObjects
{
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World",@"Hello",@"IOS", nil];
    
    // 查找数据存在的位置
    NSInteger index = [array indexOfObject:@"Hello"];
    
    // 从指定的范围查找对象
    NSRange range = {0, array.count};
    index = [array indexOfObject:@"IOS" inRange:range];
    
    index = [array indexOfObjectIdenticalTo:@"World"];
    index = [array indexOfObjectIdenticalTo:@"World" inRange:range];
    
    // 自定义查找
    // 查找单个
    index = [array indexOfObjectPassingTest:^BOOL(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        // *stop 是否停止
        // rutern,是否找到
        if ([@"World" isEqualToString:obj]) {
            *stop = YES;
            return YES;
        }
        return NO;
    }];
    
    // 多核查找单个
    index = [array indexOfObjectWithOptions:NSEnumerationConcurrent passingTest:^BOOL(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        // *stop 是否停止
        // rutern,是否找到
        if ([@"World" isEqualToString:obj]) {
            *stop = YES;
            return YES;
        }
        return NO;
    }];
    
    // 查找多个
    NSIndexSet *set = [array indexesOfObjectsPassingTest:^BOOL(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([@"Hello" isEqualToString:obj] || [@"IOS" isEqualToString:obj]) {
            return YES;
        }
        return NO;
    }];
    
    // 多核查找多个
    set = [array indexesOfObjectsWithOptions:NSEnumerationConcurrent passingTest:^BOOL(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([@"Hello" isEqualToString:obj] || [@"IOS" isEqualToString:obj]) {
            return YES;
        }
        return NO;
    }];

}

5.给数组每个元素发送消息

#pragma mark 每个元素发送消息
-(void)SendingMessageToElements
{
    NSArray *tArray = [NSArray array];
    NSArray *array = [NSArray arrayWithObjects:tArray, tArray, nil];

    // 通知数组中的每个元素执行方法
    [array makeObjectsPerformSelector:@selector(count)];
    
    // 携带参数发出通知
    [array makeObjectsPerformSelector:@selector(containsObject:) withObject:@"Hello"];
    
    // 自定义发出通知
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"enumerateObjectsUsingBlock:%lu", (unsigned long)idx);
    }];
    
    // 多核自定义通知
    [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"enumerateObjectsWithOptions:%lu", (unsigned long)idx);
    }];
    
    // 根据索引发出通知
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndex:0];
    [array enumerateObjectsAtIndexes:indexSet options:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"enumerateObjectsAtIndexes:%lu", (unsigned long)idx);
    }];
}

6.数组比较

#pragma mark 数组比较
-(void)Comparing
{
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    NSArray<NSString *> *array2 = [NSArray arrayWithObjects:@"Hello", @"World", nil];
    
    // 返回第一个相同的数据
    NSString *str = [array firstObjectCommonWithArray:array2];
    NSLog(@"firstObjectCommonWithArray:%@", str);
    
    // 数组内的内容是否相同
    BOOL isEqual = [array isEqualToArray:array2];
    NSLog(@"isEqual:%d", isEqual);
}

7.生成新数组

#pragma mark 生成新数组
-(void)DerivingNewArray
{
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World", nil];
    
    // 添加单个数据,并生成一个新的数组
    array = [array arrayByAddingObject:@"IOS"];
    
    // 添加多个数据,并返回一个新的数组
    array = [array arrayByAddingObjectsFromArray:array];
    
    // 通过过滤器筛选数组
    NSPredicate *predicate = [NSPredicate predicateWithValue:YES];
    array = [array filteredArrayUsingPredicate:predicate];
    
    // 通过范围生成数组
    NSRange range = {0, 2};
    array = [array subarrayWithRange:range];
}

8.数组排序

/** sortedArrayUsingFunction排序*/
NSInteger sortByFunction(NSString * obj1, NSString * obj2, void * context)
{
    return [obj1 compare:obj2];
}


-(void)Sorting
{
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    
    // Function 排序
    array = [array sortedArrayUsingFunction:sortByFunction context:nil];
    NSData *sortedArrayHint = array.sortedArrayHint;
    array = [array sortedArrayUsingFunction:sortByFunction context:nil hint:sortedArrayHint];
    
    // Selector 排序
    array = [array sortedArrayUsingSelector:@selector(compare:)];
    
    // Block排序
    array = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    
    // 并发block排序
    array = [array sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    
}

9.处理字符串数组

#pragma mark 处理字符串数组
-(void)WorkingWithStringElements
{
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    
    // 数组中的NSString元素拼接
    NSString *str = [array componentsJoinedByString:@","];
    NSLog(@"componentsJoinedByString:%@", str);
}

10.存储

#pragma mark 存储
- (void)CreatingDescription {
    
    NSArray<NSString *> *array = [NSArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    
    // 描述信息
    NSString *description = array.description;
    description = [array descriptionWithLocale:nil];
    description = [array descriptionWithLocale:nil indent:1];
    
    // 获取应用中Document文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    // 存储的路径
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
    
    // 写入
    BOOL write = [array writeToFile:filePath atomically:YES];
    write = [array writeToURL:[NSURL fileURLWithPath:filePath] atomically:YES];
    
}

11.可变数组初始化

#pragma mark 测试数据
- (NSString *)testData {
    
    // 获取应用中Document文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    // 测试数据
    NSArray *array = [NSArray arrayWithObjects:@"Hello", @"World", nil];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
    BOOL write = [array writeToFile:filePath atomically:YES]; // 输入写入
    NSLog(@"writeToFile:%d", write);
    
    return filePath;
    
}

#pragma mark 初始化
- (void)CreatingAndInitializing {
    
    NSString *filePath = [self testData];
    
    // (+)创建
    NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:1];
    // 根据文件路径创建数组
    mArray = [NSMutableArray arrayWithContentsOfFile:filePath];
    mArray = [NSMutableArray arrayWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
    
    // (-)创建
    mArray = [[NSMutableArray alloc] initWithCapacity:1];
    mArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    mArray = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
    
}

12.可变数组增加元素

#pragma mark 增加数据
- (void)Adding {
    
    NSMutableArray *mArray = [NSMutableArray array];
    
    // 增加单一数据
    [mArray addObject:@"iOS"];
    
    // 批量添加数据
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", nil];
    [mArray addObjectsFromArray:array];
    
    // 指定位置插入单一数据
    [mArray insertObject:@"IOS" atIndex:1];
    
    NSLog(@"%@",mArray);
    
    // 指定位置插入多个数据
    NSRange range = {1, array.count};
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:range];
    [mArray insertObjects:array atIndexes:indexSet];
    NSLog(@"%@",mArray);  
}

13.可变数组删除元素

#pragma mark 删除数据
- (void)Removing {
    
    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    
    // 删除所有元素
    [mArray removeAllObjects];
    
    // 删除最后一个元素
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    [mArray removeLastObject];
    
    // 根据位置删除对象
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    [mArray removeObjectAtIndex:0];
    
    // 根据数组删除对象
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", @"IOS", nil];
    NSArray *array = [NSArray arrayWithObjects:@"IOS",@"Hello", nil];
    [mArray removeObjectsInArray:array];
    
    // 根据对象删除
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"IOS", @"World", @"IOS", nil];
    [mArray removeObject:@"IOS"];
    // 或
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"IOS", @"World", @"IOS", nil];
    [mArray removeObjectIdenticalTo:@"IOS"];
    
    // 删除指定范围内的对象
    NSRange range = {0, 2};// 第0个位置开始,连续2个
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"IOS", @"World", @"IOS", nil];
    [mArray removeObject:@"IOS" inRange:range];
    // 或
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"IOS", @"World", @"IOS", nil];
    [mArray removeObjectIdenticalTo:@"IOS" inRange:range];
    
    // 删除指定NSRange范围内的对象,批量删除
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    [mArray removeObjectsInRange:range];
    // 或
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];
    [mArray removeObjectsAtIndexes:indexSet];
    
}

14.可变数组替换元素

#pragma mark 替换对象
- (void)Replacing{
    
    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
    NSRange range = {0, array.count};// 第0个位置开始,连续count个
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];
    
    // 指定位置替换对象
    [mArray replaceObjectAtIndex:0 withObject:@"xixi"];
    // or
    [mArray setObject:@"xixi" atIndexedSubscript:0];
    
    // 数组替换
    [mArray setArray:array];
    
    // 用array替换数组中指定位置的所有元素
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    [mArray replaceObjectsInRange:range withObjectsFromArray:array];
    // or
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    [mArray replaceObjectsAtIndexes:indexSet withObjects:array];
    
    // 局部替换,使用array中的部分元素替换目标数组指定位置的元素
    mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    range.length = 2;
    [mArray replaceObjectsInRange:range withObjectsFromArray:array range:range];
    
}

15.可变数组过滤

#pragma mark 数组过滤
- (void)Filtering {
    
    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    
    // 使用过滤器过滤数组中的元素
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id  _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
        NSLog(@"%@", evaluatedObject);
        if ([@"Hello" isEqualToString:evaluatedObject]) {
            return YES;
        }
        return NO;
    }];
    [mArray filterUsingPredicate:predicate];
    
}

16.可变数组排序

/** sortedArrayUsingFunction排序*/
NSInteger mSortByFunction(NSString * obj1, NSString * obj2, void * context) {
    return [obj1 compare:obj2];
}

#pragma mark 排序
- (void)Sorting {
    
    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Hello", @"World", @"IOS", nil];
    
    // 交换两个位置的数据
    [mArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
    
    // 对象自带的方法排序
    [mArray sortUsingSelector:@selector(compare:)];
    
    // Function排序
    [mArray sortUsingFunction:mSortByFunction context:nil];
    
    // block排序
    [mArray sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    
    [mArray sortWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    
}

demo地址:demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容