练习与示例:
1.数组相关概念
数组:OC中的数组只能存储对象类型,不能存数int,float这些基本类型
不可变数组:不能改变元素个数
2.创建一个不可变数组
NSArray *array = [[NSArray alloc]initWithObjects:@"温强", @"额尔敦", @"mc海杰", nil];
NSArray *array1 = [[NSArray alloc]initWithObjects:@"1", @"2", @"3", nil];
NSArray *array2 = @[@"a", @"b", @"c"];
3.数组元素个数
NSLog(@"%ld",array.count);
4.从数组取出索引位置的对象
NSLog(@"%@", [array1 objectAtIndex:0]);
//字面量形式,与上面方法等价
NSLog(@"array中索引值为0处的元素:%@", array2[0]);
if ([array containsObject:@"mc海杰"]) {
NSLog(@"包含");
} else {
NSLog(@"不包含");
}
5.根据对象取索引值
NSLog(@"%ld", [array indexOfObject:@"mc海杰"]);
6.将一个字符串分割
NSString *string = @"自己手动写一个域名";
NSArray *resultArr = [string componentsSeparatedByString:@"."];
NSLog(@"%@", resultArr);
7.将数组中的字符串合并
NSArray *arr = @[@"北京", @"大连", @"上海", @"南京"];
NSString *resultStr = [arr componentsJoinedByString:@" "];
NSLog(@"%@", resultStr);
8.存在如下的字符串,将其中的图片的网址提取出来
NSString *str = @"一个网址.jpg";
NSArray *result = [str componentsSeparatedByString:@"&"];
NSLog(@"%@", result);
9.有如下一个数组,@[@“type = iOS", @"Device = iPhone", @"count = 随便输入一个网址", @"password = 12345”],将其中的内容用”&"符号拼接成一个字符串
NSArray *array3 = @[@"type = iOS", @"Device = iPhone", @"count = 随便输入一个网址", @"password = 12345"];
NSString *arrayr = [array3 componentsJoinedByString:@"&"];
NSLog(@"%@",arrayr);
10.可变数组
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"温强", @"额尔敦", nil];
//字面量创建方式(不可变数组拷贝一份可变的副本)
NSMutableArray *mutableArray1 = [@[@"温强", @"额尔敦"]mutableCopy];
//由一个已知的数组创建另一个数组
NSMutableArray *mutableArray2 = [NSMutableArray arrayWithArray:mutableArray];
//添加一个元素(在数组的末未添加)
[mutableArray addObject:@"额尔敦"];
NSLog(@"%@", mutableArray);
//插入一个元素
[mutableArray insertObject:@"苏乐" atIndex:1];
NSLog(@"%@", mutableArray);
//移除一个对象(根据内存地址判定)
[mutableArray1 removeObject:@"额尔敦"];
NSLog(@"%@", mutableArray1);
[mutableArray2 removeLastObject];
//通过索引位置移除
[mutableArray1 removeObjectAtIndex:0];
//清空数组
[mutableArray1 removeAllObjects];
//修改某索引处的元素内容
mutableArray1[0] = @"张三";
NSLog(@"%@",mutableArray1);
11.向数组中添加三个名字;
从数组中查找指定的名字,并且用另一个名字替换改名字;
删除指定名字。
NSMutableArray *arrayl = [NSMutableArray arrayWithObjects:@"张三", nil];
[arrayl addObject:@"李四"];
[arrayl addObject:@"王五"];
[arrayl addObject:@"赵六"];
if ([arrayl containsObject:@"赵六"]) {
NSInteger index = [arrayl indexOfObject:@"赵六"];
[arrayl replaceObjectAtIndex:index withObject:@"小刘子"];
NSLog(@"%@",arrayl);
}
[arrayl removeObject:@"张三"];
NSLog(@"%@",arrayl);
12.创建一个字典(key和value要求都是对象类型,key通常都是字符串,且key是唯一的,不允许出现两个相同的key)
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"温强", @"name", @"99", @"age", nil];
NSString *name = [mutableDictionary objectForKey:@"name"];
//字典取值(字面量写法)
NSString *name1 = mutableDictionary[@"name"];
NSLog(@"%@",name);
NSLog(@"%@",name1);
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
NSArray *array4 = @[@"温强", @"额尔敦", @"mc海杰"];
for (NSString *key in array4) {
NSString *name = [dictionary objectForKey:key];
NSLog(@"%@",key);
NSLog(@"%@",name);
}
作业:
实现图书管理系统:
1、定义书籍Book类,含有属性name,price,author
2、使用数组管理所有书籍对象。
3、管理系统含有1.添加书籍、2.查找书籍(根据书名查找)
4、用户根据控制台提示选择功能:
输入1开始添加书籍,然后根据控制台提示依次输入书名,价格和作者,生成新的book对象,添加到数组中,控制台提示用户添加成功;
输入2提示用户输入要查找的书籍名称,然后控制台打印该书籍的名称,价格,作者信息;
提示:由c语言字符串生成一个OC字符串对象方法:
char name[50];
printf("请输入名称:");
scanf("%s", name);
NSString *nameStr = [NSString stringWithUTF8String:name];
- 新建一个Book类,在.h中新建用到的属性:
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) CGFloat price;
//@property (nonatomic, retain) NSString *price;
@property (nonatomic, retain) NSString *author;
- 在主函数中导入头文件:
#import "Book.h"
- 在主函数中实现:
//创建一个空数组
NSMutableArray *bookArray = [NSMutableArray array];
//遍历五本书
for (int i = 0; i < 5; i++) {
Book *book = [[Book alloc]init];
book.name = [NSString stringWithFormat:@"book%d", i];
book.price = i * 10;
book.author = [NSString stringWithFormat:@"author%d", i];
//把五本书装在数组中
[bookArray addObject:book];
}
//回到功能选择页面
while (YES) {
NSLog(@"1.添加书籍:\n2.查找书籍:\n");
printf("请输入数字选择功能:");
int caseNumber = 0;
scanf("%d",&caseNumber);
switch (caseNumber) {
case 1:
{
//char型数据接收
char name[50];
CGFloat price;
char author[50];
printf("请输入书籍名称:");
scanf("%s",name);
printf("请输入书籍价格:");
scanf("%lf",&price);
printf("请输入书籍作者:");
scanf("%s",author);
Book *book = [[Book alloc]init];
book.name = [NSString stringWithUTF8String:name];
book.price = price;
book.author = [NSString stringWithUTF8String:author];
[bookArray addObject:book];
NSLog(@"添加成功");
}
break;
case 2:
{
char name[50];
printf("请输入要查找的书籍名称:");
scanf("%s", name);
NSString *searchName = [NSString stringWithUTF8String:name];
BOOL flag = YES;
for (int i = 0; i < bookArray.count; i++) {
Book *book = bookArray[i];//拿到book
if ([book.name isEqualToString:searchName]) {
NSLog(@"书籍的名称是:%@,书籍的价格是:%f,书籍的作者是:%@",book.name,book.price,book.author);
flag = NO;
}
}
if (flag) {
NSLog(@"没有搜索到结果");
}
}
break;
default:
break;
}
}
知识点:
1.使用苹果帮助文档
1️⃣帮助文档的作用:帮助开发者快速了解系统类的功能。
2️⃣学会使用苹果帮助文档是开发者的一项技能。
3️⃣文档基本信息:
Inherits from 继承关系 。
Conforms to 遵循什么协议。
Framework 属于哪个框架。
Availability 什么时候可用的。
Declared in 声明在什么头文件里。
Related documents 相关文档。
Sample code 示例代码。
//快速打开帮助文档
在代码中,将鼠标停留在 类名或者方法名上,option+鼠标左键,点击Reference的超链接进入帮助文档。
也可使用command+鼠标左键,进入头文件,查看类的接口部分。
2.API与头文件的区别
1️⃣苹果帮助文档(API)中详细的介绍了方法的作用以及如何使用。
2️⃣头文件内只是简略的显示方法。
3️⃣当我们想详细的了解某一个类的功能的时候,使用苹果帮助文档(API)。
4️⃣当我们忘记某一个属性或者方法名的写法的时候,可以进入头文件进行快速查看。
3.字符串-NSString
C语言中,字符串是由char(ASCII码)字符组成。
OC中,字符串是由unichar(Unicode)字符组成。
NSString:不可变字符串,即:创建以后,内容和长度不能更改。
NSMutableString:可变字符串,即:创建以后,内容还可以修改。
4.字符串创建
初始化方法:
NSString *string = [[NSString alloc] initWithFormat:@"I love iOS!"];
format —— 格式串(使用方式与C语言格式化输出函数printf相似)
便利构造器:
NSString *string = [NSString stringWithFormat:@"I love iOS!"];
5.NSMutableString
NSMutableString是NSString 类的子类。
NSMutableString创建的字符串是一个动态的可变的字符串,可以对原字符串对象进行增、删、改等操作。
6.可变、不可变区别
不可变字符串 —— 本身不能被修改。
对不可变字符串的修改操作,操作的是原字符串的副本,得到的是一个新的字符串。
可变字符串 —— 本身能被修改。
可变字符串修改的是原字符串,因此可变字符串的操作方法 没有返回值!!!
7.NSNumber
数值类。
作用:实现 基本数据类型与OC对象类型的相互转化。
基本数据类型(int,float等)转换为NSNumber。
NSNumber转换为基本数据类型(int,float等)。
8.NSNumber字面量
常量:
NSNumber *intNumber = @38;
NSNumber *charNumber = @‘w';
变量:
int age = 18;
NSNumber *ageNumber = @(age);
char gender = 'w';
NSNumber *genderNumber = @(gender);
9.NSValue
完成结构体和对象类型 的互转。
结构体(NSRange等)转换为NSValue。
NSValue转换为结构体(NSRange等)。
10.总结
1.可变对象通常是不可变对象的子类,包含父类所有方法,并且具有对原有对象的增、删、改功能。
注:不可变字符串的修改方法有返回值。
可变字符串的修改方法没有返回值。
2.可变对象的增、删、改都是对自身对象的操作。不可变对象的增、删、改都会生成新的对象,原对象不变。
3.NSNumber、NSValue主要是为了完成基本数据类型,结构体和对象的互转,便于与collection配合使用(collection — — 集合)。