本文首发于我的个人博客:『不羁阁』 https://bujige.net 文章链接:https://bujige.net/blog/iOS-Foundation-Array.html
本文对Foundation框架中的数组类(NSArray、MutableNSArray)的使用做一个详细的总结。
+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(id)firstObj, ...;
+ (instancetype)arrayWithArray:(NSArray *)array;
+ (id)arrayWithContentsOfFile:(NSString *)path;
+ (id)arrayWithContentsOfURL:(NSURL *)url;
NSArray *arr = [NSArray arrayWithObjects:@"abc", nil ,@"edf",@"hij", nil];
NSLog(@"%@", arr);
输出结果:
(
abc
)
// 先定义一个数组,用于举例说明下面各个常用方法如何使用
NSArray *arr = [NSArray arrayWithObjects:@"abc",@"edf",@"hij", nil];
- (NSUInteger)count;
NSLog(@"count = %lu",[arr count]);
输出结果:count = 3
- (id)objectAtIndex:(NSUInteger)index;
NSLog(@"arr[1] = %@",[arr objectAtIndex:1]);
输出结果:arr[1] = edf
- (BOOL)containsObject:(id)anObject;
if ([arr containsObject:@"klm"]) {
NSLog(@"arr中包含klm");
} else {
NSLog(@"arr中不包含klm");
}
输出结果:arr中不包含klm
- (id)firstObject;
NSLog(@"first = %@",[arr firstObject]);
输出结果:first = abc
- (id)lastObject;
NSLog(@"last = %@",[arr lastObject]);
输出结果:last = hij
- (NSUInteger)indexOfObject:(id)anObject;
NSLog(@"index = %lu",[arr indexOfObject:@"hij"]);
输出结果:index = 2
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
NSRange range = {1,2};
NSLog(@"index = %lu",[arr indexOfObject:@"edf" inRange:range]);
输出结果:index = 1
[NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil];
@[@"Jack", @"Rose", @"Jim"];
[array objectAtIndex:index];
array[index];
NSArray *arr = @[@"abc", @"edf", @"hij"];
for (int i = 0; i < arr.count; ++i) {
NSLog(@"arr[%i] = %@", i, arr[i]);
}
输出结果:
arr[0] = abc
arr[1] = edf
arr[2] = hij
NSArray *arr = @[@"abc", @"edf", @"hij"];
// OC数组可以使用OC中的增强for循环来遍历
// 逐个取出arr中的元素,将取出的元素赋值给obj
// 注意:obj的类型可以根据数组中元素的类型来写,不一定要写NSObject
for (NSString *obj in arr) {
NSLog(@"obj = %@", obj);
}
输出结果:
obj = abc
obj = edf
obj = hij
NSArray *arr = @[@"abc", @"edf", @"hij"];
// 使用OC数组的迭代器来遍历
// 每取出一个元素就会调用一次block
// 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
// obj就是当前取出的元素, idx就是当前元素对应的索引
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == 1) {
*stop = YES; // stop用于控制什么时候停止遍历
}
NSLog(@"obj = %@, idx = %lu", obj, idx);
}];
输出结果:
obj = abc, idx = 0
obj = edf, idx = 1
- (void)makeObjectsPerformSelector:(SEL)aSelector;
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
// 让数组中所有对象执行这个方法
// 注意:如果数组中的对象没有这个方法会报错,需要实现该方法
// [arr makeObjectsPerformSelector:@selector(say)];
[arr makeObjectsPerformSelector:@selector(eat:) withObject:@"bread"];
NSArray *arr = @[@10,@9,@1,@19];
NSLog(@"排序前: %@", arr);
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后: %@", newArr);
输出结果:
排序前: (
10,
9,
1,
19
)
排序后: (
1,
9,
10,
19
)
定义一个Person类,Person拥有age属性。
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, assign) int age;
@end
因为不能使用compare:方法对自定义对象进行排序,我们通过执行区块block对自定义类进行排序,下面是按照age的大小对Person进行排序
Person *p1 = [Person new];
p1.age = 10;
Person *p2 = [Person new];
p2.age = 20;
Person *p3 = [Person new];
p3.age = 5;
Person *p4 = [Person new];
p4.age = 7;
NSArray *arr = @[p1, p2, p3, p4];
NSLog(@"排序前: %@", arr);
// 按照人的年龄进行排序
// 该方法默认会按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 每次调用该block都会取出数组中的两个元素给我们
return obj1.age > obj2.age; // 升序
// return obj1.age < obj2.age; // 降序
}];
NSLog(@"排序后: %@", newArr);
输出结果:
排序前: (
"age = 10",
"age = 20",
"age = 5",
"age = 7"
)
排序后: (
"age = 5",
"age = 7",
"age = 10",
"age = 20"
)
NSArray *arr = @[@"abc", @"def", @"hij", @"klm"];
BOOL flag = [arr writeToFile:@"/Users/Walkers/Desktop/test.plist" atomically:YES];
NSLog(@"flag = %i", flag);
输出结果:flag = 1
NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/Walkers/Desktop/test.plist"];
NSLog(@"newArr = %@", newArr);
输出结果:
newArr = (
abc,
def,
hij,
klm
)
- (NSString *)componentsJoinedByString:(NSString *)separator;
NSArray *arr = @[@"abc", @"edf", @"hij", @"klm"];
NSString *res = [arr componentsJoinedByString:@"*"];
NSLog(@"res = %@", res);
输出结果:res = abc*edf*hij*klm
- (NSArray *)componentsSeparatedByString:(NSString *)separator;
NSString *str = @"abc-edf-hij-klm";
NSArray *arr = [str componentsSeparatedByString:@"-"];
NSLog(@"arr = %@", arr);
输出结果:
arr = (
abc,
edf,
hij,
klm
)
NSMutableArray *arr = [NSMutableArray array];
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
- (void)addObject:(id)object;
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@"abc"];
NSLog(@"%@",arr);
输出结果:
(
abc
)
- (void)addObjectsFromArray:(NSArray *)array;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc", nil];
[arr addObjectsFromArray:@[@"def",@"hij"]];
NSLog(@"%@",arr);
输出结果:
(
abc,
def,
hij
)
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc", @"hij",nil];
[arr insertObject:@"def" atIndex:1];
NSLog(@"%@",arr);
输出结果:
(
abc,
def,
hij
)
- (void)removeLastObject;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
[arr removeLastObject];
NSLog(@"%@",arr);
输出结果:
(
abc,
def
)
- (void)removeAllObjects;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
[arr removeAllObjects];
NSLog(@"%@",arr);
输出结果:
(
)
- (void)removeObjectAtIndex:(NSUInteger)index;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
[arr removeObjectAtIndex:1];
NSLog(@"%@",arr);
输出结果:
(
abc,
hij
)
- (void)removeObject:(id)object;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
[arr removeObject:@"abc"];
NSLog(@"%@",arr);
输出结果:
(
def,
hij
)
- (void)removeObjectsInRange:(NSRange)range;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
NSRange range = NSMakeRange(1, 2);
[arr removeObjectsInRange:range];
NSLog(@"%@",arr);
输出结果:
(
abc
)
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
[arr replaceObjectAtIndex:1 withObject:@"xyz"];
NSLog(@"%@",arr);
输出结果:
(
abc,
xyz,
hij
)
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"def",@"hij",nil];
[arr exchangeObjectAtIndex:0 withObjectAtIndex:2];
NSLog(@"%@",arr);
输出结果:
(
hij,
def,
abc
)
NSMutableArray *array = @[@"lnj", @"lmj", @"jjj"];
// 报错, 本质还是不可变数组
[array addObject:@“Peter”];