详解Objective-C最基础语法和基础类型
Objective-C最基础语法和基础类型是本文要讲解的内容,不多说,我们先来看内容,我对Objective-C了解还不深,只知道一些最基础的东西,总结一下。
基础数据类型
在Objective-C里面也可以使用C的基础类型,比如int,float等,但一些Objective-C的基础类型有与C的对应的,看上去很类似,却提供了更多的功能和特性。比如string和NSString,string就是普通的C语言的字符串,而NSString是一个object,不仅包含了字符串,还有一些跟显示相关的接口等,你可以直接在屏幕上打印输出一个NSString,却不能对string这样操作。
NSInteger、NSUInteger、CGFloat
这几个类型跟C里的类型基本是一样的,但还是稍有不同,这其实是“type define”,比如NSInteger的定义是这样的:
#if_LP64_||NS_BUILD_32_LIKE_64 typedef long NSInteger; typedef unsigned long NSInteger; #else typedef int NSInteger; typedef unsigned int NSInteger; #endif
也就是说当需要使用int类型的变量的时候,可以像写C的程序一样,用int,也可以用NSInteger,但更推荐使用NSInteger,因为这样就不用考虑设备是32位的还是64位的。
BOOL
OC里面的bool值的取值是YES和NO,而不是TRUE和FALSE。
NSNumber
有人说既然都有了NSInteger等这些基础类型了为什么还要有NSNumber?它们的功能当然是不同的。
NSInteger是基础类型,但是NSNumber是一个类。如果想要存储一个数值,直接用NSInteger是不行的,比如在一个Array里面这样用:
NSArray *array = [[NSArray alloc]init]; [array addObject:3];//会编译错误
这样是会引发编译错误的,因为NSArray里面放的需要是一个类,但‘3’不是。这个时候需要用到NSNumber:
NSArray *array = [[NSArray alloc]init]; [array addObject:[NSNumber numberWithInt:3]]; NSString、NSMutableString
字符串一直是个比较复杂的类型,提供的功能很多,涉及的问题也比较多,比如字符串的比较、格式化、拼接等等,这可以专门开一个专题,这里只是简单介绍一下。
Objective-C里面有个特殊的符号:“@”,这个符号大概的意思是表示“这是Objective-C的”。在使用NSString的使用双引号的前面一定要加这个符号,否则就是普通的C字符串。而且NSString是一个类,定义一个NSString的变量的时候要使用指针。比如:
NSString *str = "a string";//这是错误的 NSString str =@"a string";//这也是错误的 NSString *str = @"a new string";//这是正确的
一个NSString变量赋值了之后不能改变其值(当然可以重新给它赋其他的值),当需要使用可变的字符串的时候可以使用NSMutableString。NSMutableString继承值NSString,额外提供了一些改变值的方法。比如:
NSMutableString *str = @""; [str appendString:@"hello "];//str = @"hello " [str appendFormat:@"my number is:%d",1];//str = @"hello my number is 1" NSArray、NSMutableArray
这是OC里面的两个集合。顾名思义,NSArray的容积是固定的,而NSMutableArray的是可变的,当添加的对象多余容积时会自动扩增。存放入集合中的一定是一个类的实例。 初始化一个NSArray的代码如:
NSArray *array = [NSArray arrayWithObjects:obj1,obj2...,nil];//注意要以nil结尾,否则会有编译警告
NSArray常用的属性当然就是count了,比如
NSUInteger count = [array count];//
当要判断一个集合里面是否包含某个元素的时候需要注意,使用的方法跟.net里面的稍有不同,如:
if ([array indexOfObject:obj3] == NSNotFound]{ //do something } NSMutableArray的使用方法跟NSArray的类似,常用的方法有: + (NSMutableArray *)array; - (void)addOvject:(id)object; - (void)removeObject:(id)object; - (void)removeAllObjects; - (void)insertObject:(id)object atIndex:(unsigned)index; NSDictionary、NSMutableDictionary
OC的字典集合,跟其他语言的字典类似,跟NSArray一样,当直接调添加若干个对象的初始化方法时,要以nil结尾,比如:
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:obj1,@"key1",obj2,@"key2",nil];//注意以nil结尾
当需要判断是否包含某个元素的时候,不是调用contain方法,而是直接判断返回的值是不是nil,比如:
if ([dic objectForKey:@"key3"]){ //这里的代码不会执行,因为key3返回的是nil } NSMutableDictionary的使用方法类似,常用的方法有: + (NSMultableDictionary *)dictionary; - (void)addObject:(id)object forKey:(id)key; - (void)removeObjectForKey:(id)key - (void)removeAllObjects; NSDate
日期和时间。OObjective-C里面的日期类使用起来比较复杂,即使是实现简单的加一天减一个小时这样的操作都要经过很多的代码从能实现,这里只是一带而过,在其他的文章里会重新提到。
获取当前时间的代码为:
NSDate *today = [NSDate date];
这里不得不发一些牢骚,很多人都说Objective-C是多么多么优美的语言,但个人感觉有不少地方实在谈不上优美,就比如这个NSDate,功能是蛮强大的,但使用起来真的很不方便,对于新手而言完全是无从下手。这且不说,获取当前时间居然用的不是today而date,如果没了解过,谁会想到date=today?
nil
Objective-C里面空指针对象是nil,而不是null。
id
Objective-C支持动态类型,也就是在写代码的时候不确定是声明类型,在程序运行的时候从能判断。动态类型的变量用id来声明,比如:
id tem = 1;//注意是id,而不是id *,除非你真的真的是想声明一个这样的指针
tem = @"abc"; tem = [[myClass alloc]init]; @selector