这是我参与「第四届青训营-iOS专场」笔记创作活动的第3天。我将会简单讲解一下Objective-C(以下简称OC)编程语言中一些常用的数据类型。
NSString
继承于NSObject,用来处理OC中的字符串。
注意:相比于C语言中的char类型,NSString不是纯粹的字符串,因为它是一个类,拥有变量,属性,和方法。
创建
NSString有以下几种最常用的创建方式:
NSString *stringObject = @"hello";- 切记一定要写 @
- 将C语言的字符串转为一个NSString对象
NSString *stringObject1 = [NSString stringWithUTF8String:"hello"];
- 用alloc init来创建空的字符串对象
NSString *stringObject2 = [[NSString alloc] init];
NSString *stringObject3 = [NSString stringWithString:@"hello"];
一些常用方法和属性
- 我们可以用
[stringObject length]来获取stringObject的长度 - 可以用
[stringObject characterAtIndex:0]来获取stringObject中位于第一位的字符 - 截取子字符串:
[stringObject substringFromIndex:1](从索引位置到结尾)[stringObject substringToIndex:3](从开始到索引位置)- 也可以用NSRange指定所需截取的索引位置和长度
类型转换
可以用initWithFormat方法将其他(bool,浮点,整数等)类型单独或组合转换成字符串。
例:
int a = 123;
NSString *stringObject5 = [[NSString alloc]initWithFormat:@"%d , %@", a, "str"];
如果已有字符串,可以使用boolValue,intValue,floatValue,doubleValue等方法将字符串转换成对应基础类型。
NSArray
同样继承于NSObject,用来处理OC中的数组。NSArray中存放的必须是OC对象。所以如果想保存一些基础类型,需要把它们封装成OC对象才能放在数组里面。
创建
NSArray有以下几种最常用的创建方式:
NSArray *arr = [NSArray array];- 创建一个空数组
- 也可以用
NSArray *arr = [[NSArray alloc] init];
- 使用@[...]格式创建非空数组
NSArray *arr = @[@"iOS", @"Android", @"Server"];
也可以用
NSArray *arr = [NSArray arrayWithObjects:@"iOS", @"Android", @"Server"];
- 限制存放对象
NSArray<NSNumber *> *numberArrayObject = @[@(1), @(-1), @(3.3)];
注:@(value)自动将value转化成一个NSNumber对象
一些常用方法和属性
- 我们可以用
array.count来获取array中所含元素的个数 - 可以用
array[0]来获取array中存于第一位的对象 - 可以用
[array containsObject:str]来得知array中是否包含指定的对象
NSArray vs. NSMutableArray
NSArray是不可变(只读)数组,而NSMutableArray是可变数组,它拥有声明的增与删的方法。
相比于NSArray,如果使用NSMutableArray:
- 对象数据可能被修改
- 线程不安全
- 查找性能较差
- 一般用作方法内的临时变量,可做增删
NSDictionary
同样继承于NSObject,字典可以用来存放Key-Value pairs。同样,一个字典中的Key或者Value也都要存储OC对象。
NSDictionary有以下几种最常用的创建方式:
- 创建单一Key-Value pair
NSDictionary *dict = @{ @"key1":@"value1" };- 也可以用
[NSDictionary dictionaryWithObject:@"key1" forKey:@"value1"]
- 创建多个Key-Value pairs
NSDictionary *dict = @{ @"key1":@"value1", @"key2":@"value2" };
NSDictionary *dict = [[NSDictionary alloc]initWithObjects:@[@"value1",@"value2"] forKeys:@[@"key1",@"key2"]];
也可以用
NSArray *arr = [NSArray arrayWithObjects:@"iOS", @"Android", @"Server"];
- 指定字典中存放的类型
NSDictionary<NSString*, NSNumber*> *dictionaryObject = @{ @"numberKey1": @(0), @"numberKey2": @(1), }
一些常用方法和属性
- 我们可以用
[dictionary1 count]来获取dictionary1中所含元素的个数 - 可以用
[dictionary1 objectForKey:@"key1"];来获取dictionary1中key1对应的值- 等同于
dictionary1[@"key1"]
- 等同于
- 可以用
[dictionary1 allKeys]来获取dictionary1中所有Key的集合 - 同理,用
[dictionary1 allValues]来获取dictionary1中所有Value的集合
总结
OC中有很多可供开发人员使用的数据类型,各有利弊。我们应该分析所需储存数据的结构,从而判断哪一个数据类型擅长于储存这个数据结构。并且,像Array和Dictionary都有可变和不可变两种,它们各自的优缺点也在前文有所罗列,我们应该分析利弊从而决定应该使用哪种数据类型,利用哪些自带的方法和属性来轻松实现简单的功能。