這篇文章咱們講講 OC
中的類型。html
上一篇文章已經說了,OC是對C的擴展,所以能夠直接使用C中的類型:java
long l; int i; float f; double f2; bool isTrue; void m; struct { int score; char myId; } student; // ...
接下來介紹 Foundation
框架中給咱們帶來的新的類型:python
BOOL
注意大小寫,這不是C中的 bool
,不知道這個類型的定義是不是畫蛇添足。
它有 YES
和 NO
兩個值,顧名思義。咱們知道,C中定義真假,無非是0或非0,而且它能夠喝數值相互轉換,但 BOOL
顯然不行。
內存中, YES
和 NO
是八位的,值以下:程序員
YES:00000001 NO :00000000
當使用 BOOL
與數值比較時,只有數值的低位會參與比較,從而得出不許確的結果,因此千萬不要這麼作。下面上一段官方的example:objective-c
#import <Foundation/Foundation.h> BOOL areIntsDifferent(int thing1,int thing2) { if(thing1==thing2) { return NO; } else { return YES; } } NSString *boolString(BOOL yesNo) { if(yesNo == NO) { return @"NO"; } else { return @"YES"; } } int main(int argc, const char * argv[]) { BOOL areTheyDifferent; areTheyDifferent = areIntsDifferent(5, 5); NSLog(@"Are %d and %d different? %@",5,5,boolString(areTheyDifferent)); areTheyDifferent = areIntsDifferent(23,42); NSLog(@"Are %d and %d different? %@",23,42,boolString(areTheyDifferent)); return 0; }
NSString
爲區別於 C 中的 string
字符串, NSString
字符串會在 雙引號前加 @
,前文中咱們已經看到了。編程
類 NSString
自己就提供了不少有用的方法,咱們看代碼:segmentfault
//... NSString *string1 = [[NSString alloc] init]; // 構造空字符串 NSString *string2 = [[NSString alloc] initWithString:@"This is a String!"]; // 構造字符串 NSString *string3 = @"This is also a String!"; string1 = @"This is the first String!"; // 常量字符串,這個最簡單。 /* 將C中的string類型賦過來 */ char *Cstring = "This is a String!"; NSString *cString = [[NSString alloc] initWithCString:Cstring]; NSLog(@"astring:%@,%@",string1,string2); [astring release]; //...
NSString *stringFormat = [[NSString alloc]initWithFormat:@"This is a formated string ,number %i",1]; NSLog(@"Format:%@",stringFormat);
對了,EcmaScript 6 已經引進了跨行字符串以及格式化字符串,有興趣的同窗能夠谷歌一下!數組
NSString *string01 = @"This is a String!"; NSString *string02 = @"This is a String!"; NSString *astring01 = @"This is a String!"; NSString *astring02 = @"this is a String!"; /* 判斷二者內容是否相同,下面兩種方法均可以: */ BOOL isEqual = [string01 isEqualToString:string02]; // YES BOOL compare1 = [string01 compare:string02] == NSOrderedSame; /* NSOrderedAscending判斷兩對象值的大小:按字母順序進行比較,astring02大於astring01爲YES */ BOOL compare2 = [astring01 compare:astring02] == NSOrderedAscending; /* NSOrderedDescending判斷兩對象值的大小:按字母順序進行比較,astring02小於astring01爲真 */ BOOL result = [astring01 compare:astring02] == NSOrderedDescending;
NSString *string1 = @"This is a string"; NSString *string2 = @"is a"; NSRange range = [string1 rangeOfString:string2]; /* NSRange 類型其實是一個C的結構體,不要被這個不明覺厲的東東嚇到 struct { int location; int length; } NSRange; */ int location = range.location; // 包含字符串所在的起始位置,這裏的值爲5,如不存在,爲-1 int leight = range.length; // 長度,這裏的值爲4,如不存在,爲0
NSString *string0 = @"This is a string"; // 1.從字符串的開頭一直截取到指定的位置,但不包括該位置的字符 NSString *string1 = [string0 substringToIndex:3]; NSLog(@"string1:%@",string1); // string1:Thi // 2.以指定位置開始(包括指定位置的字符),幷包括以後的所有字符 NSString *string2 = [string0 substringFromIndex:3]; NSLog(@"string2:%@",string2); // string2:s is a string // 3.按照所給出的位置,長度,任意地從字符串中截取子串 NSString *string3 = [string0 substringWithRange:NSMakeRange(0, 4)]; /* NSMakeRange 顧名思義,建立一個NSRange類型的結構體 */ NSLog(@"string3:%@",string3); // string3:This
OC這種靜態語言,中的不少引用類型(這麼說合適麼?)的 內存空間都是固定的、內存空間都是固定的、內存空間都是固定的,對於習慣了 js 和 python 的程序員們,重要的事情說三遍!
因此嘞,什麼NSString類型啊,以及咱們後面要講的NSArray、NSSet這類東西長度都是固定的。固然OC也提供了長度可變的相應類型,後者通常是前者的子集,例如:NSMutableString
NSMutableArray
。想要修改字符串,就要用到這種類型。app
NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"This is a NSMutableString"]; // 1. 把一個字符串接在另外一個字符串的末尾 [string1 appendString:@", I will be adding some character"]; [string1 appendFormat:[NSString stringWithFormat:@",%i",100]]; NSLog(@"string1:%@",string1); // 2. 在指定位置插入字符串 [string1 insertString:@"Hi! " atIndex:0]; // 3. 替換原有內容 NSMutableString *setString1 = [string1 setString:@"Hello World!"]; // 4.用指定字符串替換字符串中某指定位置、長度的字符串 [string1 replaceCharactersInRange:NSMakeRange(0, 4) withString:@"That"]; // That is a NSMutableString // 5.檢查字符串是否以另外一個字符串開頭或結尾 NSString *fileName = @"NSStringInformation.txt"; [fileName hasPrefix:@"NSString"] = = 1 ? NSLog(@"YES") : NSLog(@"NO"); [fileName hasSuffix:@".txt"] = = 1 ? NSLog(@"YES") : NSLog(@"NO");
NSNumber
它其實是一種數值對象,但咱們通常仍然使用C語言中的數值類型。下面代碼僅簡單演示一下用法:框架
NSNumber *number = [NSNumber numberWithInt:123]; // 建立一個整型值 // 或使用構造方法 [[NSNumber alloc] initWithInt:123] NSLog(@"%i",[number intValue]); // 或 NSLog(@"%@",number); /* 還有: [NSNumber numberWithBool]; ... numberWithChar ... numberWithFloat ... stringValue ... isEqualToNumber:(NSNumber *) aNSNumberVariable */
NSArray
和 NSMutableArray
OC中的數組有一個好,那就是它能夠儲存不一樣類型的變量,而且, NSArray
不能保存基本類型(必須是引用類型——做者注:這個術語用在OC編程中並不嚴謹)。
若是須要將基本類型存儲在 NSArray
數組中,上面的 NSNumber
就派上了用場。我一直以爲 NSNumber
就像 python
或 java
裏的包裝器對象,能起到相似做用的類型還有 NSValue
、 NSDate
。
另外一個問題就是,不能將 nil
加入 NSArray
數組,由於這表明數組到此結束,若是須要加入一個空對象,請使用 NSNull
。
想要查看
Foundation
中提供的所有類型,請點擊蘋果官方文檔。
仍是直接代碼演示一遍:
NSArray *arr = [NSArray arrayWithObjects:@"Sep",@"Januay",@"April",nil]; /* 因爲 nil 只表明數組結束,因此實際上數組有三個成員。 也能夠直接賦值: NSArray *arr=@[@"Sep",@"Januay",@"April",nil]; */ for(int i = 0;i<[arr count];i++){ NSLog(@"%@ at count %i",name,i); } // count 即數組的長度,至關於 java數組中的length /* 咱們還能夠用 for ... in 語法快速遍歷數組, 與js中的 for ... in 語法不一樣,OC對此進行了優化,實際上比for語法遍歷數組的速度更快。 但後者的缺點是不能對數組成員進行修改、刪除操做,不然編譯器將報錯。 */ // 返回數組指定下標的成員: NSString *str0 = [arr objectAtIndex:0]; // 或 NSString *str0 = arr[0]; // 返回數組個數 NSLog(@"arr count :%d", [ar count]); // 追加成員並返回新的array對象 NSArray *arr2 = [arr arrayByAddingObject:@"August"]; NSLog(@"arr2 :%@", arr2); // 是否包含指定對象 NSLog(@"isContains :%d", [arr containsObject:@"April"]); // 查找某個成員所在索引,若成員不存在則返回-1 NSLog(@"indexOfObject :%d",[arr indexOfObject:@"August"]); // 返回第一個或最後一個元素 NSLog(@"firstObject:%@,lastObejct :%@", [arr firstObject] , [arr lastObject]); // ...
到目前爲止,所介紹的經常使用到的 Foundation
類依然是比較少的,咱們會在後面的文章中繼續介紹。
結尾插個話:我發現 OC
中好像並無嚴格意義上的方法重載,咱們注意到, OC
的方法名老是由於行參變化而改變,實際上就是兩個不一樣的方法。
本文的內容忽略了一個問題:內存引用計數的問題,由於前兩篇文章已經說了,OC的內存管理須要手動管理, java
和 python
中則不存在這個問題。咱們在後面的內容中再討論吧。
參考文檔: