第八章Foundation Kit快速教程
一、一些有用的數據類型
NSRange範圍
typedef struct _NSRange{
unsigned int location;
unsigned int length;
}NSRange;
unsigned int是C語言中的int類型
location用來存放字段範圍的起始位置,length是該範圍內所含元素的個數
字符串”Objective-C is a cool language”中cool的location爲17,length爲4
三種賦值方式:
(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.start和length爲數字,沒找到start爲NSNotFound
可變性的字符串
NSMutableString
NSString是不可變的字符串,NSMutableString是NSString的子類可以改變字符串的長度
使用類方法stringWithCapacity創建或stringWithFormat –因爲繼承的關係NSString中的類也可調用
+(id)stringWithCapacity:(unsigned) capacity;
例:NSMutableString *string;
string = [NSMutableString stringWithCapacity:42];
附加新字符串appendString或appendFormat
-(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的對象,不能存nil(0或NULL值)
構造方法+(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"];
五、各種基本數據類
因爲NSArray和NSDictionary只能存儲對象,所以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可以包含任何值
NSValue是NSNumber的超類
NSValue可以放入NSArray和NSDictionary中
構造函數:+(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"]