OC学习(一) -- 数据类型

[TOC]

OC学习

数据类型 (精通C的没必要看这部分)

基本数据类型

整型 浮点型 字符型
int float / double char

修饰词

short long signed unsigned
int / double int / doubel int / char int / char

TIPS

  1. 这些限定词经常用来限定int型,在限定int类型时int可以省略;
  2. short和long会改变int型的长度,在不同编译器长度不相同,但是一般short长度不大于int,int长度不大于long;
  3. signed和unsigned不会改变类型长度,仅表示最高位是否为符号位,其中unsigned表示大于等于0的正数;

取值范围

int unsigned int short unsigned short long unsigned shot
-2147483648 ~ 2147483647 0~4294967295 -32768~32767 0~65535 -2147483648~2147483647 0~4294967295

存储空间

数据类型 16位编译器 32位编译器 64位编译器
char 1byte 1byte 1byte
int 2byte 4byte 4byte
float 4byte 4byte 4byte
double 8byte 8byte 8byte
short int 2byte 2byte 2byte
unsigned int 2byte 4byte 4byte
long 4byte 4byte 8byte
unsigned long 4byte 4byte 8byte
long long 8byte 8byte 8byte

TIPS

关于这些基本数据类型,平时用的时候有几点需要注意一下:

  1. char类型是最小的数据类型(任意编译器下都是占1Byte),char类型的变量可以赋值某个字符、也可以赋值ASCII值;
  2. 可以使用long long来修饰一个整型,但是long long不能修饰double;
  3. 不存在short short;
  4. 浮点型常量后面加f,编译器认为是float类型,否则是double类型;

数字、字符串和集合数据对象

数字对象NSNumber

专门用来封装基础类型的对象,把整型、单精度、双精度、字符型等基础类型存储为对象

//基本数据类型
//专门用来封装基础类型的对象
NSNumber * intNumber = [[NSNumber alloc] initWithInt:5];
NSNumber * floatNumber = [[NSNumber alloc] initWithFloat:3.14f];
NSNumber * doubleNumber = [[NSNumber alloc] initWithDouble:6.7];
NSNumber * charNumber = [[NSNumber alloc] initWithChar:'A'];
NSNumber * intNumber2 = [NSNumber numberWithInt:6];

**判断两个NSNumber是否相等 **

BOOL ret = [intNumber isEqualToNumber:intNumber2]; //这种比较也是可以跨不同对象的,比如:比较intNumber和floatNumber

**比较两个整型的NSNumber的大小 **

//比较两个整型的NSNumber的大小
if ([intNumber compare:intNumber] == NSOrderedAscending) {
    NSLog(@"<");
}else if([intNumber compare:intNumber2] == NSOrderedSame){
    NSLog(@"=");
}else if([intNumber compare:intNumber2] == NSOrderedDescending){
    NSLog(@">");
}

**通过以下方法可以还原这些基本数据类型的数据 **

NSLog(@"%d", [intNumber intValue]);
NSLog(@"%f", [floatNumber floatValue]);
NSLog(@"%f", [doubleNumber doubleValue]);
NSLog(@"%c", [charNumber charValue]);

字符串对象NSString

  1. 创建字符串对象
NSString *str = @"Hello world!";
NSString *str2 = [[NSString alloc] initWithString:str];
NSString *str3 = [[NSString alloc] initWithUTF8String:"hello world"]; //用C的字符串创建OC的字符串对象
NSString *str4 = [[NSString alloc] initWithFormat:@"hello %d %c",5,'A']; //使用格式符拼接成一个字符串  

临时字符串,不需要进行release

NSString *str5 = [NSString stringWithUTF8String:"hellow world"];
NSString *str6 = [NSString stringWithFormat:@"%d %@ %c",1,@"hello",'R'];
NSString *str7 = [NSString stringWithString:str];
  1. 字符串的方法
NSString *str = @"hello world!";
NSString *str2 = @"hello word!";

判断两个字符串是否相等

BOOL ret = [str isEqualToString:str2];
NSLog(@"%d", ret);//返回true或者false,由于返回值是0或1,所以用%d

比较两个字符串的大小

//比较两个字符串的大小
NSComparisonResult comRet = [str compare:str2]; //NSComparisonResult是一个枚举,返回值NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
if(comRet == NSOrderedAscending){
    NSLog(@"str < str2");
}
else if(comRet == NSOrderedSame){
    NSLog(@"str == str2");
}
else if(comRet == NSOrderedDescending){
    NSLog(@"str > str2");
}

** 查找字符串的位置**

NSString *str = @"I am a so bad man.";
NSString * subStr = @"so";
NSRange range = [str rangeOfString:subStr];//查找subStr在str中的位置,返回NSRange -- 返回位置和长度
NSLog(@"location:%lu, %lu",range.location,range.length);

** 获取子字符串**

NSString *str = @"0123456789";
NSString *str2 = [str substringToIndex:6];    //从str中提取从头至第6个字符串(不包括第6个),生成新字符串,返回字符串地址。
NSString *str3 = [str substringFromIndex:6];    //从str中提取第6个字符(包括第6个),到最后一个字符,生成新字符串,返回字符串地址
//根据指定范围提取字符串
NSRange range = {3, 4};//3表示起始位置,4表示长度
NSString *str4 = [str substringWithRange:range];
NSString *str5 = [str substringWithRange:NSMakeRange(3, 4)];//与上面相同,NSMakeRange直接返回Range
  1. 可变字符串 (NSMutableString)

继承自字符串,拥有以上的所有方法:包括创建、提取、比较等,但是也增加了一些方法
不能用这个方法创建可变字符串:NSMutableString *str = @"Hello world!";
其他的创建方法都可以。

增加的方法:增、删、改、查

NSMutableString *str = [[NSMutableString alloc] init];
[str setString:@"hello"];   //设置可变字符串的内容,再次设置就会发生替换字符串内容
//增,两种方式:追加、插入
[str appendString:@"123"];  //追加append,在结尾处字符串
[str appendFormat:@"%c",'R'];    //追加append,在结尾处追加格式符         
[str insertString:@"XXXX" atIndex:4];   //插入insert,在Index位置插入
//删,delete
[str deleteCharactersInRange:NSMakeRange(3, 5)];    //从第3个开始,删除5个字符
//改,replace
[str replaceCharactersInRange:NSMakeRange(3, 2) withString:@"RRRRRRRR"];

数组对象NSArray

  1. 数组的初始化
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", @"Four", nil];

数组的元素可以是任意的对象,不局限于字符串;
数组中装有元素的地址;

NSLog(@"%@", array);    //打印数组,实际上是打印数据的每一个对象。因为数组重写的Description方法

遍历数组中的对象

  • 枚举器法
NSEnumerator *enumerator = [array objectEnumerator];
id obj;
while (obj = [enumerator nextObject]) {
    NSLog(@"%@", obj);
}
  • 快速枚举法
for(id obj in array){
    NSLog(@"%@", obj);
}
  • 使用下标i
NSUInteger length = [array count]; //返回数组元素的个数
obj = [array objectAtIndex:2]; //返回单个元素的地址
NSInteger i;
for(i = 0; i<[array count];i++){
    NSLog(@"%@", [array objectAtIndex:i]);
}
  1. 可变数组
NSMutableArray *array = [[NSMutableArray alloc] init];
//往可变数组中添加元素
[array addObject:@"one"];
[array addObject:@"two"];
[array addObject:@"three"];

交换两个数组的位置

[array exchangeObjectAtIndex:0 withObjectAtIndex:2];

删除元素,remove

[array removeObject:@"one"];
[array removeObjectAtIndex:1];
[array removeAllObjects];

同时遍历和删除数组元素的时候,需要逆序;否则,会出现问题

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
//逆序
NSEnumerator *enumerator = [array reverseObjectEnumerator];
NSString *str;
while (str = [enumerator nextObject]) {
    [array removeLastObject];
    NSLog(@"%@",str);
}
NSLog(@"%@",array);
  1. 数组和字符串的联合使用

将一个字符串逆序输出

NSString *str = @"I am a so bad man";
NSArray *array = [str componentsSeparatedByString:@" "]; //用空格分割字符串
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
NSEnumerator *enumerator = [array reverseObjectEnumerator];
NSString *obj;
while (obj = [enumerator nextObject]) {
    [mutableArray addObject:obj];
}
NSString *newStr = [mutableArray componentsJoinedByString:@" "]; //用指定的字符串,拼接字符串

字典对象NSDictionary

  1. 字典NSDictionary

字典与数组的区别:数组讲究顺序,而字典可以快速帮助我们找到数据,数据是我们的目的,键是我们的手段

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3", nil];

字典中的元素是以键值对的形式存储的
@"one"和@"1"组成了一个键值对
@"one"称为值(value)@"1"称为键(key)
键值对的键和值,都是任意的对象,但是键往往使用字符串
字典存储对象的地址没有顺序
字典的遍历分为:键的遍历和值的遍历

NSEnumerator *enumeratorKey = [dict keyEnumerator]; //键的遍历  
NSEnumerator *enumeratorValue = [dict objectEnumerator]; //值的遍历  

通过键快速的找到值

NSString *str = [dict objectForKey:@"1"];

快速枚举法

for(id obj in dict){ //这种方式遍历到的是键Key,获得了键,也就获得了值
    NSLog(@"%@",obj);
    NSLog(@"%@",[dict objectForKey:obj]);
}
  1. 可变字典NSMutableDictionary,是字典的子类,拥有字典的所有方法,并且有一些自己的方法。
//初始化
NSMutableDictionary *mDict = [[NSMutableDictionary alloc] init];

添加键值对(set)

//添加
[mDict setObject:@"one" forKey:@"1"];
[mDict setObject:@"two" forKey:@"2"];

删除键值对(remove)

//删除
[mDict removeObjectForKey:@"1"];

集合对象NSSet

  1. 集合

集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。
集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。

NSSet * set = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
[set count]; //返回集合中对象的个数

判断集合中是否拥有某个元素

//判断集合中是否拥有@“two”
BOOL ret = [set containsObject:@"two"];

判断两个集合是否相等

NSSet * set2 = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
//判断两个集合是否相等
BOOL ret = [set isEqualToSet:set2];

判断set是否是set2的子集合

NSSet * set2 = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four",@"five", nil];
//判断set是否是set2的子集合
BOOL ret = [set isSubsetOfSet:set2];

集合也可以用枚举器来遍历

//集合也可以用枚举器来遍历
NSEnumerator * enumerator = [set objectEnumerator];
NSString *str;
while (str = [enumerator nextObject]) {
    ……
}

通过数组来初始化集合(数组转换为集合)

NSArray * array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSSet * set = [[NSSet alloc] initWithArray:array];

集合转换为数组

NSArray * array2 = [set allObjects];
  1. 可变集合NSMutableSet
//可变集合NSMutableSet
NSMutableSet * set = [[NSMutableSet alloc] init];
[set addObject:@"one"];
[set addObject:@"two"];
[set addObject:@"two"]; //如果添加的元素有重复,实际只保留一个

删除元素

//删除元素
[set removeObject:@"two"];
[set removeAllObjects];

并集(A∪B={x|x∈A,或x∈B})

//将set2中的元素添加到set中来,如果有重复,只保留一个
NSSet * set2 = [[NSSet alloc] initWithObjects:@"two",@"three",@"four", nil];
[set unionSet:set2];

差集合

//删除set中与set2相同的元素
[set minusSet:set2];
  1. 指数集合(索引集合)NSIndexSet
//指数集合(索引集合)NSIndexSet
NSIndexSet * indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1, 3)]; //集合中的数字是123

根据集合提取数组中指定位置的元素

//根据集合提取数组中指定位置的元素
NSArray * array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSArray * newArray = [array objectsAtIndexes:indexSet]; //返回@"two",@"three",@"four"
  1. 可变指数集合NSMutableIndexSet
NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc] init];
[indexSet addIndex:0]
[indexSet addIndex:3];
[indexSet addIndex:5];
//通过集合获取数组中指定的元素
NSArray *array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four",@"five",@"six", nil];
NSArray *newArray = [array objectsAtIndexes:indexSet]; //返回@"one",@"four",@"six"

你可能感兴趣的:(OC学习(一) -- 数据类型)