詳解Objective-C最基礎(chǔ)語(yǔ)法和基礎(chǔ)類型
Objective-C最基礎(chǔ)語(yǔ)法和基礎(chǔ)類型是本文要講解的內(nèi)容,不多說(shuō),我們先來(lái)看內(nèi)容,我對(duì)Objective-C了解還不深,只知道一些最基礎(chǔ)的東西,總結(jié)一下。
基礎(chǔ)數(shù)據(jù)類型
在Objective-C里面也可以使用C的基礎(chǔ)類型,比如int,float等,但一些Objective-C的基礎(chǔ)類型有與C的對(duì)應(yīng)的,看上去很類似,卻提供了更多的功能和特性。比如string和NSString,string就是普通的C語(yǔ)言的字符串,而NSString是一個(gè)object,不僅包含了字符串,還有一些跟顯示相關(guān)的接口等,你可以直接在屏幕上打印輸出一個(gè)NSString,卻不能對(duì)string這樣操作。
NSInteger、NSUInteger、CGFloat
這幾個(gè)類型跟C里的類型基本是一樣的,但還是稍有不同,這其實(shí)是“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
也就是說(shuō)當(dāng)需要使用int類型的變量的時(shí)候,可以像寫C的程序一樣,用int,也可以用NSInteger,但更推薦使用NSInteger,因?yàn)檫@樣就不用考慮設(shè)備是32位的還是64位的。
BOOL
OC里面的bool值的取值是YES和NO,而不是TRUE和FALSE。
NSNumber
有人說(shuō)既然都有了NSInteger等這些基礎(chǔ)類型了為什么還要有NSNumber?它們的功能當(dāng)然是不同的。
NSInteger是基礎(chǔ)類型,但是NSNumber是一個(gè)類。如果想要存儲(chǔ)一個(gè)數(shù)值,直接用NSInteger是不行的,比如在一個(gè)Array里面這樣用:
- NSArray *array = [[NSArray alloc]init];
- [array addObject:3];//會(huì)編譯錯(cuò)誤
這樣是會(huì)引發(fā)編譯錯(cuò)誤的,因?yàn)镹SArray里面放的需要是一個(gè)類,但‘3’不是。這個(gè)時(shí)候需要用到NSNumber:
- NSArray *array = [[NSArray alloc]init];
- [array addObject:[NSNumber numberWithInt:3]];
- NSString、NSMutableString
字符串一直是個(gè)比較復(fù)雜的類型,提供的功能很多,涉及的問題也比較多,比如字符串的比較、格式化、拼接等等,這可以專門開一個(gè)專題,這里只是簡(jiǎn)單介紹一下。
Objective-C里面有個(gè)特殊的符號(hào):“@”,這個(gè)符號(hào)大概的意思是表示“這是Objective-C的”。在使用NSString的使用雙引號(hào)的前面一定要加這個(gè)符號(hào),否則就是普通的C字符串。而且NSString是一個(gè)類,定義一個(gè)NSString的變量的時(shí)候要使用指針。比如:
- NSString *str = "a string";//這是錯(cuò)誤的
- NSString str =@"a string";//這也是錯(cuò)誤的
- NSString *str = @"a new string";//這是正確的
一個(gè)NSString變量賦值了之后不能改變其值(當(dāng)然可以重新給它賦其他的值),當(dāng)需要使用可變的字符串的時(shí)候可以使用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里面的兩個(gè)集合。顧名思義,NSArray的容積是固定的,而NSMutableArray的是可變的,當(dāng)添加的對(duì)象多余容積時(shí)會(huì)自動(dòng)擴(kuò)增。存放入集合中的一定是一個(gè)類的實(shí)例。 初始化一個(gè)NSArray的代碼如:
- NSArray *array = [NSArray arrayWithObjects:obj1,obj2...,nil];//注意要以nil結(jié)尾,否則會(huì)有編譯警告
NSArray常用的屬性當(dāng)然就是count了,比如
- NSUInteger count = [array count];//
當(dāng)要判斷一個(gè)集合里面是否包含某個(gè)元素的時(shí)候需要注意,使用的方法跟.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的字典集合,跟其他語(yǔ)言的字典類似,跟NSArray一樣,當(dāng)直接調(diào)添加若干個(gè)對(duì)象的初始化方法時(shí),要以nil結(jié)尾,比如:
- NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:obj1,@"key1",obj2,@"key2",nil];//注意以nil結(jié)尾
當(dāng)需要判斷是否包含某個(gè)元素的時(shí)候,不是調(diào)用contain方法,而是直接判斷返回的值是不是nil,比如:
- if ([dic objectForKey:@"key3"]){
- //這里的代碼不會(huì)執(zhí)行,因?yàn)閗ey3返回的是nil
- }
- NSMutableDictionary的使用方法類似,常用的方法有:
- + (NSMultableDictionary *)dictionary;
- - (void)addObject:(id)object forKey:(id)key;
- - (void)removeObjectForKey:(id)key
- - (void)removeAllObjects;
- NSDate
日期和時(shí)間。OObjective-C里面的日期類使用起來(lái)比較復(fù)雜,即使是實(shí)現(xiàn)簡(jiǎn)單的加一天減一個(gè)小時(shí)這樣的操作都要經(jīng)過(guò)很多的代碼從能實(shí)現(xiàn),這里只是一帶而過(guò),在其他的文章里會(huì)重新提到。
獲取當(dāng)前時(shí)間的代碼為:
- NSDate *today = [NSDate date];
這里不得不發(fā)一些牢騷,很多人都說(shuō)Objective-C是多么多么優(yōu)美的語(yǔ)言,但個(gè)人感覺有不少地方實(shí)在談不上優(yōu)美,就比如這個(gè)NSDate,功能是蠻強(qiáng)大的,但使用起來(lái)真的很不方便,對(duì)于新手而言完全是無(wú)從下手。這且不說(shuō),獲取當(dāng)前時(shí)間居然用的不是today而date,如果沒了解過(guò),誰(shuí)會(huì)想到date=today?
nil
Objective-C里面空指針對(duì)象是nil,而不是null。
id
Objective-C支持動(dòng)態(tài)類型,也就是在寫代碼的時(shí)候不確定是聲明類型,在程序運(yùn)行的時(shí)候從能判斷。動(dòng)態(tài)類型的變量用id來(lái)聲明,比如:
id tem = 1;//注意是id,而不是id *,除非你真的真的是想聲明一個(gè)這樣的指針
- tem = @"abc";
- tem = [[myClass alloc]init];
- @selector
selector是個(gè)非常特殊的類型,有點(diǎn)類似與函數(shù)指針,可以把一個(gè)函數(shù)當(dāng)作參數(shù)來(lái)傳遞。這個(gè)需要專門討論
小結(jié):關(guān)于Objective-C最基礎(chǔ)語(yǔ)法和基礎(chǔ)類型的內(nèi)容介紹完了,希望本文對(duì)你會(huì)有所幫助,更多關(guān)于Objective-C的更多內(nèi)容請(qǐng)參考編輯推薦。