第三章 字符串

第三章 字符串

一些有用的数据类型: 表示范围作用的结构体:NSRange: 有三种方式创建新的 NSRange

1、NSRange range; range.location = 17; range.length = 4;

2、NSRange range = {17 ,4}; 3、NSRangerange=NSMakeRange(17,4); (推荐)

表示用来处理几何图形的数据类型:NSPoint(点坐标)和 NSSize(长度和宽度)还有一个矩形数据类 型(由点和大小复合而成)NSRect
Cocoa 提供创建这些数据类型方法:NSMakePoint() 、NSMakeSize()和 NAMakeRect()

表示字符串的类 NSString
NSString *heigth =[NSString stringWithFormat: @"Youheigth is %d feet,%d inches", 5,11];

创建的类对象包含了指向超类的指针、 类名和指向类方法的列表的指针。 类对象还包含一lon个g 的数据, 为新创建的类对象指定大小。

 返回字符串中的字符的个数:

unsigned int length = [heigth length]; 返回 Bool 值的字符串比较函数:

- (BOOL) isEqualToString:(NSString *)aString;//比较两个字符串的内容是否相等 还可以使用 compare :方法

-(NSComparisonResult)compare :(NSString *)string;//逐个字符比较 不区分大小写的比较:

-(NSComparisonResult)compare :(NSString *)string options:(unsigned)mask; 注意:NSComparisonResult 是一个枚举值

options 是一个位掩码,即: NSCaseInsensitiveSearch:不区分大小写
NSLiteralSearch: 进行完全比较,区分大小写 NSNumericSearch: 比较字符串的字符个数,而不是字符值

检查字符串是否以另一个字符串开头 -(BOOL)hasPrefix : (NSString *)aString;

判断字符串是否是以另一个字符串结尾

-(BOOL)hasSuffix : (NSString *)aString; 如果你想知道字符串内的某处是否包含其他字符串,使用rangeOfString: 方法

-(NSRange)rangeOfString :(NSString *)aString;
NSString 是不可变的,NSMutableString 是可变的。用方法 stringWithCapacity :来创建

NSMutableString *string = [NSMutableString stringWithCapacity :42];

可以使用 appendString :或 appendFormat : 来附加新字符串: - (void) appendString :(NSString *)aString;
- (void) appendFormat :(NSString *)format , . . . ; 可以使用deleteCharactersInRange: 方法删除字符串中的字符 -(void)deleteCharactersInRange: (NSRange)range;

集合家族:

NSArray:用来存储对象的有序列表(任意类型的对象)
限制: 只能存储Objective—C 的对象, 不能存储C 语言的基本数据类型 (int、float、enum、struct、 或者NSArray 中的随机指针) 。同时也不能存储nil(对象的零值或NULL值)

//创建一个新的 NSArray
NSArray *array =[NSArray arrayWithObjects: @"one",@"two",nil]; //获得包含的对象个数
- (unsigned)count;
//获得特定索引处的对象
- (id)objectAtIndex :(unsigned int)index ;

切分数组:

使用 componentsSeparatedByString : 来切分 NSArray,
NSString *string = @"oop : ack : bork : greeble : ponies" ;
NSArray *chunks = [string componentsSeparatedByString : @":"];
使用 componentsJoinedByString : 来合并 NSArray 中的元素并创建字符串 string = [chunks componentsJoinedByString :@":-)"] ;

NSArray 是不可变数组,数组中包含的对象是可以改变的,但是数组对象本身是不会改变的。

可变数组 NSMutableArray 通过类方法 arrayWithCapacity : 来创建可变数组 + (id)arrayWithCapacity :(unsigned)numItems ;
NSMutableArray *array = [NSMutableArray arrayWithCapacity : 17];

使用 addObject : 在数组末尾添加对象 - (void)addObject :(id)anObject

删除特定索引的对象
- (void)removeObjectAtIndex :(unsigned)index; 注:可变数组还可以在特定索引处插入对象,替换对象,为数组排序N,SArray 还提供了大量好用的功能。

枚举:

NSEnumerator 用来描述这种集合迭代器运算的方法:
要想使用 NSEnumerator,需要通过 objectEnumerator 向数组请求枚举器:
- (NSEnumerator *) objectEnumerator;
可以像这样使用这个方法:
NSEnumerator *enumerator;
enumerator = [array objectEnumerator ]; 注:若想从后向前枚举集合,使用方法reverseobjectEnumerator; 也可以使用。 获得枚举器以后,开始 while 循环,每次循环都向这个枚举器请求它的nextObject - (id)nextObject;//返回 nil 表明循环结束 注:在枚举的过程中不能改变数组容器。

快速枚举示例:

for(NSString *string in array){ NSLog(@"I found %@", string);

}

数组排序:

例如:一条记录就是一条卡片的信息,包括(NSString *name 和 NSString *email) -(void)sort
{

   [book sortUsingSelector:@selector(compareNames:)]
}

其中:

@selector(compareNames:)

//创建一个 SEL 类型的 selector,sortUsingSelector:使用该方法比较数组中的两个元素, sortUsingSelector:方法需要完成这样的比较,它先调用这个指定的selector 方法,然后向数组(接受 者)的第一条记录发送消息,比较其参数和此记录。指定方法的返回值为NSComparisonResult 类型,返 回值为:若小于返回NSOrderedAscending;相等返回 NSOrderedSame;大于返回NSOrderedDescending -(NSComparisonResult)compareNames:(id)element

{
return [name compare:[element name]];

}

NSDictionary: (关键字和定义的组合)
NSDictionary 通常在给定一个关键字(通常是一个NSString 字符串)下存储一个数值(可以是任何类

型的对象) 。然后你可以使用这个关键字查找相应的数值。 使用 dictionaryWithObjectsAndKeys :来创建字典
+ (id)dictionaryWithObjectsAndKeys :(id)firstObject , . . .

例如:

Tire *t1 = [Tire new];
NSDictionary *tires = [ NSDictionary dictionaryWithObjectsAndKeys :t1,@"front-left",nil];

使用方法 objectForKey :来获取字典中的值 - (id)objectForKey :(id)akey; 查找轮胎可以这样:
Tire *tire = [tires objectForkey : @"front-left"];

创建新的 NSMutableDictionary 对象,向类 NSMutableDictionary 发送 dictionary 消息。也可以使用 dictionaryWithCapacity: 方法来创建新的可变字典

+ (id)dictionaryWithCapacity:(unsigned int)numItems ; 可以使用方法setObject :forKey :方法给字典添加元素 setObject : forKey :(id)aKey

下面是另一种使用发送 dictionary 消息来创建字典的方法: NSMutableDictionary *tires;
tires = [NSMutableDictionary dictionary] ;
[tires setObject :t1 forKey :@"front-left"];

...
注:若对字典中已有的关键字使用setObject :forKey :方法,则用新的替换

可以使用 removeObjectForKey : 方法来删除可变字典中的一个关键字 - (void)removeObjectForKey:(id)aKey ;

注:不要去创建 NSString、NSArray 或 NSDictionary 的子类,实在要的话可以用复合的方式来解决问题。

使用这种方法枚举词典:

for(NSString *key in g) {

... }

集合对象:

Set 是一组单值对象的集合,有可变和不可变,操作包括:搜索、添加、删除集合中的成员(仅用于可变 集合) 、比较两个集合,计算两个集合的交集和并集等。

#import <Foundation/NSSet.h>

常用的 NSSet 方法

方法

说明

+(id)setWithObjects:obj1,obj2,...,nil

使用一列对象创建新集合

-(id)initWithObjects:obj1,obj2,...,nil

使用一列对象初始化新分配的集合

-(NSUInteger)count

返回集合的成员个数

-(BOOL)containsObject:obj

确定集合是否包含 obj

-(BOOL)member:obj

使用 isEqual: 方法确定集合是否包含obj

-(NSEnumerator *)objectEnumerator

为集合中的所有对象返回一个 NSEnumerator 对象

-(BOOL)isSubsetOfSet:nsset

确定 receiver 的每个成员是否都出现在 nsset 中

-(BOOL)intersectsSet:nsset

确定是否 receiver 中至少一个成员出现 在对象 nsset 中

-(BOOL)isEqualToSet:nsset

确定两个集合是否相等

常用的 NSMutableSet 方法(NSSet 的子类)

方法

说明

-(id)setWithCapacity:size

创建新集合,使其具有存储 size 个成员的初始空间

-(id)initWithCapacity:size

将新分配的集合设置为 size 个成员的存储空间

-(void)addObject:obj

将对象 obj 添加到集合中

-(void)removeObject:obj

从集合中删除对象 obj

-(void)removeAllObjects

删除接受者的所有成员

-(void)unionSet:nsset

将对象 nsset 的所有成员昂添加到接受者

-(void)minusSet:nsset

从接受者中删除 nsset 的左右成员

-(void)intersectSet:nsset

将接受者中的所有不属于 nsset 的元素删除

注:NSInteger 不是一个对象,基本数据类型的 typedef,被 typedef 成 64 位的 long 或 32 位 int

各种数值: NSNumber:

可以使用对象来封装基本数值。
NSNumber 类来包装基本数据类型。
+ (NSNumber *)numberWithChar :(char)value ;
+ (NSNumber *)numberWithInt :(int )value ;
+ (NSNumber *)numberWithFloat :(float)value ;
+ (NSNumber *)numberWithBool :(BOOL)value ; 还有包括无符号版本和各种 long 型数据及 long long 整型数据 例如:NSNumber *number = [NSNumber numberWithInt : 42] ; 将一个基本类型封装到NSNumber 后,可以使用下列方法重新获得:

  • -  (char)charValue;

  • -  (int)intValue;

  • -  (float)floatValue;

  • -  (BOOL)boolValue;

  • -  (NSString *)stringV alue;

    NSV alue:
    NSNumber 实际上是 NSV alue的子类, NSV alue可以封装任意值。 可以用NSV alue将结构放入 NSArray

    和 NSDictionary 中。
    创建新的 NSV alue:
    +(NSValue*)valueWithBytes: (const void *) value

    objCType: (const char *)type;
    @encode 编译器指令可以接受数据类型的名称并为你生成合适的字符串。

NSRect rect = NSMakeRect(1,2,30,40);
NSValue* value ;
value = [NSValuevalueWithBytes: &rect objCType: @encode(NSRect)];

使用getValue:来提取数值 (传递的是要存储这个数值的变量的地址)(先找地址再取值) value = [array objectAtIndex : 0];
[ value getV alue: & rect ] ;

注:Cocoa 提供了将常用的struct 型数据转化成NSValue的便捷方法: + (NSValue*)valueWithPoint :(NSPoint)point ;
+ (NSValue*)valueWithSize :(NSSize)size;
+ (NSValue*)valueWithRect :(NSRect)rect ;

- (NSSize)sizeValue;
- (NSRect)rectValue;
- (NSPoint)pointValue;

NSNull:

在关键字下如果属性是NSNull表明没有这个属性, 没有数值的话表明不知道是否有这个属性[N。SNull null] //总返回一样的值

+ (NSNull *)null;
例如:
[contast setObject : [NSNull null] forKey: @"home"]; 访问它:
id home = [contast objectForKey : @"home" ] ;
if (home==[NSNullnull]){

...

}

NSFileManager 允许对文件系统进行操作(创建目录、删除文件、移动文件或获取文件信息) //创建一个属于自己的 NSFileManager 对象
NSFileManager *manager = [NSFileManager defaultManager] ;
//将代字符‘~’替换成主目录

NSString *home = [@"~" stringByExpandingTildeInPath]; //输出文件的扩展名
- (NSString*)pathExtension

示例:翻查主目录,查找.jpg 文件并输出找到的文件列表 //*********************************************************************************

#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSFileManager *manager;
manager = [NSFileManager defaultManager];

NSString *home;
home = [@"~" stringByExpandingTildeInPath];

NSDirectoryEnumerator *direnum;
direnum = [manager enumeratorAtPath: home];

NSMutableArray *files;
files = [NSMutableArray arrayWithCapacity:42];

NSString *filename;
while (filename = [direnum nextObject]) {

if ([[filename pathExtension] isEqualTo:@"jpg"]) { [files addObject: filename];

} }

NSEnumerator *fileenum;
fileenum = [files objectEnumerator];

while (filename = [fileenum nextObject]) {
NSLog (@"%@", filename);

}

[pool drain];

return 0; }

//*********************************************************************************

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容