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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,958评论 6 13
  • 蛙泳的口诀:划手腿不动,收手再收腿,先伸手臂再蹬腿,并拢伸直漂一会。 今天连游两圈,虽然5米一停顿,但也...
    渔舟_唱晚阅读 134评论 0 0
  • 其实也无所谓,人生就是一趟列车,有缘分的朋友就坐到邻座畅谈一路,也让旅途的风景变得更美。但是毕竟目的地不同,所以邻...
    37度女王阅读 315评论 0 2
  • 个人的三个目标: 全面的计算机知识=》合格的架构师其他行业的知识=》综合能力减肥=》身体
    黄亿华阅读 246评论 0 0
  • 开着两轮摩托车 后座载着看景的人 从繁华到人烟稀少 一路上的事物一直在变 老妪驮着孩童 农夫在地里插秧 头上的炊烟...
    叫我梅芳就好阅读 50评论 0 0