第8章 Foundation Kit介紹
8.1 Foundation
Foundation AppKit(OS X)和UIKit(IOS)兩個UI框架的基礎,包含很多有用的、面向對象的簡單類和數據類型,可在IOS和OS X應用程序中兼容。
8.3 一些有用的數據類型
8.3.1 NSRange
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
8.3.2 幾何數據類型
由Core Graphics(C)框架提供,用於進行2D渲染,帶CG前綴,如CGPoint、CGSize、CGRect,用C結構體以提升性能。
8.4 字符串
8.4.1 創建字符串
最常用的莫過於直接把一個常量字符串付給一個變量,比如 :NSString * tmp = @”Hello, World!!” ;
其次是使用類方法 +(id) stringWithFormat:(NSString *) format,⋯;
比如:
int h = 178;
NSString * height = [NSString stringWithFormat:@"Your height is %d cm",h ]
8.4.2 獲取字符串的長度
- (unsigned int)length;
8.4.3 字符串比較
A: - (BOOL)isEqualToString:(NSString *)aString
兩個字符串相同返回YES,不同返回NO。
B:- (NSComparisonResult)compare:(NSString *)aString
其中NSComparisonResult定義如下:
typedef enum _NSComparisonResult {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
}NSComparisonResult;
這個比價反映了兩個字符串的大小關係,比如 [@”aardvark” compare:@”zygote”]將返回NSOrderedAscending。
C:不區分大小寫的比較:compare:options:
options是一個位掩碼,常用選項如下:
NSCaseInsensitiveSearch, 不區分大小寫。
NSLiteralSearch, 進行完全比較,區分大小寫。
NSNumericSearch.比較字符串的字符個數,而不是字符值。
不區分大小寫比較也可以用函數 - (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString。
D:字符串中是否有別的字符串,字符串查找
- (BOOL)hasPrefix:(NSString *)aString 是否以一個字符串開頭
- (BOOL)hasSuffix:(NSString *)aString 是否以一個字符串結尾。
- (NSRange)rangeOfString:(NSString *)aString 查找一個字符串的起始位置。如果沒找到返回{NSNotFound,0}
8.4.4 從一個字符串獲取子字符串
- (NSString *)substringFromIndex:(NSUInteger)anIndex 從指定位置開始到字符串結束
- (NSString *)substringToIndex:(NSUInteger)anIndex 從字符串開始第一個到指定位置。
- (NSString *)substringWithRange:(NSRange)aRange 取一個字符串中間的一部分。
8.4.5 字符串連接
- (NSString *)stringByAppendingString:(NSString *)aString
- (NSString *)stringByAppendingFormat:(NSString *)format
8.4.6 可變字符串
NSString是不可變的,意味着一旦創建好,就不能再改變,不能對它刪除或者重置。
Cocoa 提供了NSString的子類NSMutableString,可以實現可變字符串。NSMutableString常見方法。
+ (id)stringWithCapacity:(NSUInteger)capacity 創建一個字符串並指定最大長度。
- (void)appendString:(NSString *)aString 追加字符
- (void)appendFormat:(NSString *)format 按格式追加字符
- (void)deleteCharactersInRange:(NSRange)aRange 刪除指定位置的字符。
- (void)insertString:(NSString *)aString atIndex(NSUInteger)anIndex 在指定位置插入字符
- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString替換指定位置的字符
- (void)setString:(NSString *)aString 重置字符串。
8.5 集合大家族
8.5.1 NSArray
NSArray只能存儲Objective-C的對象,原始的C語言對象如int、float等以及nil(對象的零值或NULL值)不能存儲。
+ (id)arrayWithObjects:(id)firstObj, ... 創建NSArray
- (NSUInteger)count 獲取對象個數
- (id)objectAtIndex:(NSUInteger)index 通過索引獲取數組中的一個對象
示例
NSArray * array = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
NSString * tmp = [array objectAtIndex:2];
//遍歷數組
for (NSString * string in array) {
NSLog(@"array:%@",string);
}
切分數組
NSString *tempString = [mutableArray componentsJoinedByString:@","];將array數組轉換爲string字符串
NSArray *array = [str componentsSeparatedByString:@","];將string字符串轉換爲array數組
8.5.2 NSMutableArray
跟NSString和NSMutableString的關係一樣,如果需要對數組的值進行刪除或者重置操作,需要用到可變數組 NSMutableArray。
+ (id)arrayWithCapacity:(NSUInteger)numItems 創建一個指定初始化長度的數組。
- (void)addObject:(id)anObject 添加一個元素。
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index 在指定位置添加一個元素。
- (void)removeObjectAtIndex:(NSUInteger)index 刪除一個數組元素
創建數組指定的參數並不是說數組的最大容量,系統只是根據這個值來預分配一個初始的內存大小,添加更多的元素也是允許的。
8.5.3 NSEnumerator
表示集合中迭代出的對象。支持Mac OS X10.4或更早的系統。
- (NSEnumerator *)objectEnumerator; 創建枚舉器
- (id) nextObject; 獲取下一個對象,返回nil時循環結束
//通過枚舉器來遍歷數組
NSEnumerator *arrayEnum = [_array objectEnumerator];
id object = nil;
//枚舉器是通過nextobject來獲取到對應的對象,如果沒有得到對象,則返回nil,while條件不成立,則結束。
while (object = [arrayEnum nextObject]) {
NSLog(@"%@",object);
}
//獲取數組的逆序枚舉器
NSEnumerator *reverseArrayEnum = [_array reverseObjectEnumerator];
while (object = [reverseArrayEnum nextObject]) {
NSLog(@"%@",object);
}
8.5.4 快速枚舉
性能更快
for (NSString * string in array) {
NSLog(@"array:%@",string);
}
8.5.5 代碼塊枚舉
併發執行
[array enumerateObjectsUsingBlock:^(NSString* obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
8.5.6 NSDictionary
+ (id)dictionaryWithObjectsAndKeys:... 創建一個字典。
- (id)objectForKey:(id)aKey 獲取相應關鍵字的值。
NSMutableDictionary
+ (id)dictionaryWithCapacity: (NSInteger)numItems 創建一個字典
- (void)setObject:(id) anObject forKey:(id)aKey 增加一個元素,若該key存在,則替換
- (void)removeObjectForKey: (id)aKey刪除一個元素。
8.6 其他數值
集合只能存儲Objective-C對象,不能直接存儲基本類型的數據,需要對其進行封裝。
8.6.1 NSNumber
封裝基本數據類型(也可以使用字面量語法)
+ numberWithChar:
+ numberWithFloat:
+ numberWithInt:
+ numberWithBool:
對應的獲得方法
– charValue
– floatValue
– intValue
– boolValue
- stringValue
8.6.2 NSValue
封裝任意值
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type
傳遞的第一個參數是你想要包裝數值的地址。第二個參數是描述這個數據類型的字符串,使用@encode指令接受類型名稱生成字符串。
- (void)getValue:(void *)buffer;
示例
NSValue *value = [NSValue valueWithBytes:&result objCType:@encode(int)];
[value getValue:&result];
8.6.3 NSNull
nil在集合中表示結束,所以用NSNull表示集合元素爲空
+ (NSNull *)null;
[profile setObject:[NSNull null] forKey:@"phoneNumber"];