Objective-C學習筆記第八章Foundation Kit快速教程

第八章Foundation Kit快速教程

一、一些有用的數據類型

NSRange範圍

typedef struct  _NSRange{

         unsigned int location;

         unsigned int length;

}NSRange;

unsigned intC語言中的int類型

location用來存放字段範圍的起始位置,length是該範圍內所含元素的個數

字符串”Objective-C is a cool language”coollocation17length4

三種賦值方式:

(1)       直接給字段賦值

NSRange range;

range.location = 17;

range.length = 4;

(2)       C語言的聚合結構賦值

NSRange range = {17,4};

(3)       Cocoa提供的快捷函數NSMakeRange(位置參數、長度參數)

NSRange range = NSMakeRange(17,4);

可以在方法調用中傳遞參數

[anObject  flarbulateWithRange: NSMakeRange(13,15)];

 

幾何數據類型

NSPoint笛卡兒平面中的座標點(x,y

typedef struct _NSPoint{

         float x;

         float y;

}NSPoint;

快捷函數:NSMakePoint()

NSSize用來存儲長度和寬度

typedef  struct _NSSize{

         float width;

         float height;

}NSSize;

快捷函數:NSMakeSize()

NSRect矩形數據類型

typedef  struct  _NSRect{

         NSPoint origin;

         NSSize  size;

}NSRect;

快捷函數:NSMakeRect();

 

 

二、字符串NSString

NSString類,其字符串以@開頭,例@”Hello World”

 

格式化字符串

stringWithFormat方法

+(id) stringWithFormat(NSString *)format,….

最後的….表示這個方法可以接收多個逗號隔開的其他參數

+(id)表示這個方法屬於類對象不屬於類的實例對象,類方法可以訪問全局數據

-)聲明的方法是實例方法,在實例對象中運行

例:NSString *height;

         height = [NSString stringWithFormat:@”Your height is %d feed. %d incheds”,5,11];

 

字符串長度

length方法

-(unsigned  int) length;

unsigned int length = [height length];

在表達式中使用

if([height length] > 35){

         NSLog(@”wow,you’re really tall!!”);

}

 

 

字符串比較方法

isEqualToString方法可以用來比較接收方(接收消息的對象)和當做參數傳遞來的字符串,返回BOOL

例:

         -(BOOL)isEqualToString:(NSString *)aString;

NSString *thing1 = @”hello”;

NSString *thing2 = @”hello”;

if([thing1 isEqualToString: thing2]){

         NSLog(@”They are the same”);

}

 

compare方法,將接收對象和傳遞來的字符串逐個字符進行比較,返回一個NSComparisonResult(枚舉型數據),是區分大小寫的比較

typedef  enum  _NSComparisonResult{

         NSOrderedAscending = -1,

         NSOrderedSame,

         NSOrderedDescending

} NSComparisonResult;

例:[@”aardvark”  compare: @” zoinks”] 返回NSOrderedAscending

[@”zoinks”  compare: @”jinkies”] 返回NSOrderedDescending

         [@”fnord”  compare:@”fnord”] 返回NSOrderedSame

不區分大小寫的參數

-(NSComparisonResult)   compare: (NSString)string

                                   options(unsigned)mask;

options參數是一個位掩碼,可以使用位或|來添加選項標記

                   NSCaseInsensitiveSearch:不區分大小寫字符

                   NSLiteralSearch:進行完全比較,區分大小寫

                   NSNumericSearch:比較字符串的字符個數,不比較字符值,不選他100會排在99                                                              前面

例:

if([thing1 compare :thing2 option : NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame)

{

         NSLog(@"is Match");

}

 

字符串檢索

-(BOOL)hasPrefix:(NSString *) aString;          檢查字符串是否以另一個字符串開頭

-(BOOL)hasSuffix:(NSString *) aString;          判斷字符串是否以另一個字符串結尾

例子:if([filename hasPrefix: @”draft”])

 

字符串某處包含其他字符串

-(NSRange) rangeOfString : (NSString *)aString;

例:NSRange range = [fileName rangeOfString : @"chapter"];

找到了range.startlength爲數字,沒找到startNSNotFound

可變性的字符串

NSMutableString

NSString是不可變的字符串,NSMutableStringNSString的子類可以改變字符串的長度

使用類方法stringWithCapacity創建或stringWithFormat –因爲繼承的關係NSString中的類也可調用

+(id)stringWithCapacity:(unsigned) capacity;

例:NSMutableString *string;

         string = [NSMutableString  stringWithCapacity:42];

附加新字符串appendStringappendFormat

-(void) appendString: (NSString *) aString;                aString附加到接收對象的末尾

-(void) appendFormat: (NSString *) format, ….;      將格式化的字符串附加在接收字符串的末尾

刪除字符串中的字符deleteCharactersInRange

例:創建朋友列表

NSMutableString *friends;

         friends = [NSMutableString  stringWithCapacity:50];

         [friends  appendString: @”James BethLynn Jack Evan”];

         查找Jack的字符範圍

         NSRange  jackRange;

         jackRange  = [friends  rangeOfString: @”Jack”];

         jackRange.length++;        吃掉剩下的空間

         刪除Jack

         [friends  deleteCharactersInRange:  jackRange];

 

 

三、集合

NSArray不可變數組

NSArray可以存入任意類型的對象,通過索引訪問對象

                   不可以存非Objective-C的對象,不能存nil0NULL值)

構造方法+(id)arrayWithObjects:object, …. , nil;

結尾處必須加nil已表示賦值結束

例子:     NSArray  *array;

                   array  = [NSArray arrayWithObjects : @”one” , @”two” , @”three” , nil];

 

獲取數組對象個數

-(unsigned) count;

獲取特定索引處的對象

-(id) objectAtIndex: (unsigned int) index;

 

例子:二者結合用於循環

                   int I;

                   for (I = 0; I < [array  count]; i++){

         NSLog(@”index  %d  has  %” , i , [array  objectAtIndex:  i]);

}

 

切分數組

-componentsSeparatedByString

例子:

                   NSString  *string  = @”oop:ack:bork:greeble:ponies”;

                   NSArray  *chunks = [string  componentsSeparatedByString: @”:”];

componentsJoinedByString合併NSArray中的元素創建字符串

                   string = [chunks  componentsJoinedByString: @”:-)”];

 

 

NSMutableArray可變數組

可以任意添加和刪除數組中的對象

 

構造方法:

+(id) arrayWithCapacity : (unsigned) numitems;

例:

NSMutableArray *array;

array = [NSMutableArray  arrayWithCapacity : 17];

 

使用addObject在數組末尾添加對象:

-(void) addObject : (id) anObject;

例:

for(i = 0; i < 4 ; i++){

         Tire  *tire = [Tire new];

         [array  addObject : tire];

}

 

使用removeObjectAtIndex刪除對象:

-(void) removeObjectAtIndex : (unsigned) index;

例:[array  removeObjectAtIndex : 1];

 

 

四、枚舉

NSEnumerator使用枚舉來迭代運算集合

通過objectEnumerator從前向後遍歷集合

通過reverseObjectEnumerator從後向前遍歷集合

-(NSEnumerator *) objectEnumerator;

-(NSEnumerator *) reverseObjectEnumerator;

 

利用while循環向枚舉器請求nextObject對象(下一個對象):

-(id) nextObject;

nextObject返回nil時循環結束

舉例代碼:

         NSEnumerator  *enumerator;

         enumerator = [array  objectEnumerator];

         Id  thingle;

         while(thingle = [enumerator  nextObject]){

                   NSLog(@"I  found %@",thingle);

         }

 

Tip:對可變數組操作時不能通過添加或刪除對象來改變數組容器,否則程序會崩潰

 

 

快速枚舉

Mac OS X 10.5 Leopard 中添加了此方法,之前版本無法使用

 

循環會遍歷數組中的每個元素,並用指定的變量存儲每個數組對象

:

         for (NSString  *string  in  array){

                   NSLog(@"I  found  %@", string);

         }

 

NSDictionary不可變字典集合

鍵值對集合,不可變集合,在創建時就要提交全部的對象和關鍵字

 

字典集合對於頻繁查詢和大型數據集來說要比其他數組高效的多,他直接通過鍵查詢而無需遍歷集合

 

構造函數+(id) dictionaryWithObjectsAndKeys : (id) firstObject,(id)firstKey,....;

此方法接受對象和關鍵字交替存儲的序列,以nil值作爲終止符,不能在集合中添加nil

舉例代碼:

         Tire  *t1 = [Tire  new];

         Tire  *t2 = [Tire  new];

         Tire  *t3 = [Tire  new];

         Tire  *t4 = [Tire  new];

        

         NSDictionary  *tires;

 

         tires = [NSDictionary  dictionaryWithObjectsAndKeys :

                            t1,@"front-left" , t2,@"front-right" ,

                            t3,@"back-left" , t4,@"back-right",nil];

使用方法objectForkey來獲取字典中的值,向方法傳遞對應值的關鍵字

-(id) objectForKey : (id) akey;

舉例代碼:

         Tire  *tire = [tires  objectForKey : @"back-right"];

如果沒有找到會返回nil

 

NSMutableDictionary可變字典集合

構造函數+(Id) dictionaryWithCapacity : (unsigned int) numitems;

長度只是建議無限制

也可使用dictionary

 

使用setObject : forKey方法給字典添加元素

-(void) setObject : (id) anObject forKey : (id) aKey;

舉例代碼:

         NSMutableDictionary  *tires;

         tires = [NSMutableDictionary dictionary];

         [tires  setObject : t1  forKey : @"front-left"];

如果已經有了該對象則修改該對象

 

使用removeObjectForKey方法刪除關鍵字和對象

-(void)removeObjectForKey : (id) akey;

舉例代碼:

         [tires  removeObjectForKey : @"back-left"];

 

 

五、各種基本數據類

因爲NSArrayNSDictionary只能存儲對象,所以Objective-C提供了將基礎數據類型封裝爲對象的類

NSNumber類包裝基本數據類型

使用下列類方法創建新的NSNumber對象

+(NSNumber  *) numberWithChar : (char) value;

+(NSNumber  *) numberWithInt : (int) value;

+(NSNumber  *) numberWithFloat : (float) value;

+(NSNumber  *) numberWithBool : (BOOL) value;

還有很多其他數據類型的方法,行駛大同小異

 

調用封裝到NSNumber中的數據

-(char) charValue;

-(int) intValue;

-(float)floatValue;

-(BOOL) boolValue;

-(NSString  *) stringValue;

etc

Tip:高精度數據可以被低精度數據提取方法提取出來,NSNumber會對數據進行適當轉換

 

 

 

NSValue可以包含任何值

NSValueNSNumber的超類

NSValue可以放入NSArrayNSDictionary

 

構造函數:+(NSValue  *) valueWithBytes : (const void *) value  存儲變量的地址

                                                                                                                                   C語言中使用操作符&對象                                                                                                                                  名來操作對象地址

                                                        objCType : (const char *) type;               描述數據類型的字符串

                                                                                                                                   @encode編譯器指令產生                                                                                                                          數據類型字符串

 

舉例代碼:

         NSRect  rect = NSMakeRect(1,2,30,40);

         NSValue  *value;

         value = [NSValue    valueWithBytes : &rect

                                               objCType : @encode(NSRect)];

         [array  addObject : value];

 

使用方法getValue來提取數值:需提供數值變量的地址,即&對象名

-(void) getValue : (void *) value;

舉例代碼:

         value = [array  objectAtIndex : 0];

         [value  getValue : &rect];

Tip:還記得嗎,get開頭的方法返回的是一個指針

 

Cocoa提供了將常用struct型數據轉換爲NSValue的方法:

+(NSValue  *) valueWithPoint : (NSPoint) point;

+(NSValue  *) valueWithSize : (NSSize) size;

+(NSValue  *) valueWithRect : (NSRect)rect;

 

-(NSPoint) pointValue;

-(NSSize) sizeValue;

-(NSRect) rectValue;

舉例代碼:在NSArray中存儲和檢索NSRect

         value = [NSValue  valueWithRect : rect];

         [array  addObject : value];

         ……

         NSRect  anotherRect = [value  rectValue];

 

NSNull空值對象

因爲nil在集合中有特殊含義所以創造出來這個類來代替nil

獲得一個NSNull空值方法+(NSNull  *) null;

舉例代碼:

(1)判斷是否爲空

         id homefax;

         homefax = [contact  objectForKey : @"123 456 789"];

         if(homefax  ==  [NSNull  null]){

                   //

         }

(2)將空添加到集合中

         [contact          setObject : [NSNull  null]

                                     forKey : @"is nil"]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章