黑马程序员——Objecttive-C学习笔记(四):Foundation Kit

本文介绍了Cocoa框架中的基本数据结构,包括NSRange、CGPoint等,并详细讲解了NSString类的创建、比较和搜索等功能。同时,还对比了NSString与NSMutableString的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——- android培训ISO培训、期待与您交流! ———-

Foundation框架所有的类都可以在Xcode安装文档中找到。可以在Xcode的Organizer窗口选择Documentation选项卡,来查看这些文档。

Foundation框架是以另外一个框架CoreFoundation为基础创建的。CoreFoundation是用纯C语言写的,如果函数或变量的名称以CF开头,那么它们就属于CoreFoundation框架。

一些有用的数据结构

Cocoa提供了一些结构体(struct)。

范围

第一个结构体是NSRange:

typedef struct _NSRange
{
    unsigned int location;
    unsigned int length;
} NSRange;

这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组理的元素范围。Location字段存放该范围的起始位置,length字段则是该范围内所含元素的个数。在字符串”Objective-C is a cool language”中,单词cool可以用location为17,length为4的范围来表示。location还可以用NSNotFound这个值来表示没用范围。比如变量没有初始化。
创建新的NSRange有三种方式。第一种,直接给字段赋值:

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

第二种,应用C语言的组合结构赋值机制:

NSRange range ={ 17, 4 };

第三种,是使用Cocoa提供的快捷函数NSMakeRange():

NSRange range = NSMakeRange( 17, 4 );

使用NSMakeRange()的好处是可以在任何使用函数的地方使用它,例如在方法调用中将其作为参数进行传递。

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

几何数据类型

用来处理几何图形的数据类型,它们的名称都带有CG前缀,如CGPoint和CGSize。这些类型是由Core Graohics框架提供的,用来进行2D渲染。Core Graphics是用C语言写的,因此可以在代码中使用C语言的数据类型。CGPoint表示的是笛卡尔平面中的一个坐标( x, y )。

struct CGPoint
{
    float x;
    float y;
};

CGSize用来储存长度和宽度:

struct CGSize
{
    float width;
    float height;
};

CoCoa提供了一个矩形数据类型,它由坐标和大小复合而成。

struct CGRect
{
    CGPoint origin;
    CGSize size;
};

Cocoa提供了创建这些数据类型的快捷函数:CGPoint()CGSizeMake()CGRectMake()

字符串

创建字符串

printf()NSLog()之类的函数会接受格式字符串和一些参数来输出格式化的结果。NSString的stringWithFormat :方法就是这样通过格式化字符串和参数来创建NSString的。

+ (id) stringWithForamt : (NSString *) format, ...;

可以按如下方式创建一个新的字符串:

NSString *height;
height = [NSString stringWithFormat : @"Your height is %d feet,%d inches", 5. 11];

得到的字符串是:”Your height is 5 feet,11 inches”

类方法

stringWithFormat :的声明的最后的省略号 ”“, 告诉编译器这个方法可以接受多个以逗号隔开的其他参数,就像printf()NSLog()一样。

stringWithFormat :的声明的起始字符是一个“+”, 这表明这个方法是一个类方法类方法属于类对象(注意不是类的实例对象),类方法通常用于创建新的实例。这种用来创建相比对象的类方法通常称为工厂方法
stringWithFormat :就是一个工厂方法,它根据提供的参数创建新对象。

Objective-C生成一个类的时候,会创建一个代表该类的类对象类对象包含指向超类、类名和类方法列表的指针,还包含一个long类型的数据,为新创建的实例对象指定大小(以字节为单位)。

类方法可以用来访问全局数据。AppKit中的NSColor类和UIKit中的UIColor类都拥有以各种颜色命名的类方法,比如redColor和blueColor。要用蓝色绘图,可以像下面这样编写代码:

NSColor *haveTheBlues = [NSColor blueColor];

UIColor *blueMan = [UIColor blueColor];

要创建的大部分方法都是实例方法,要用 “-” 作为前缀来进行声明。这些方法在指定的对象实例中起作用,比如获取一个Circle的颜色或者一个Tire的压强。如果某方法实现的是很通用的功能,那么可以用 “+” 作为前缀声明成类方法

关于大小

NSString的length方法返回字符串中的字符个数:

- (NSUInteger) length;

可以这么使用:

NSUInteger length = [height length];

也可以在表达式中使用:

if ([height length] > 35)
{
    NSLog (@"wow,you're really tall!");
}

字符串比较

NSString提供了几个用于比较字符串的功能:

isEqualToString : 用来比较接收方(receiver, 接受消息的对象) 和作为参数传递过来的字符串。isEqualToString : 返回一个BOOL值(YES或NO)来表示两个字符串的内容是否相同。
声明如下:
- (BOOL) isEqualToString: (NSString *) aString;

使用方法如下:

NSString *thing1 = @"hello 5";
NSString *thing2 = [NSString stringWithFormat: @"hello %d", 5];

if ([thing1 isEqualToString: thing2])
{
    NSLog (@"They are the same!");
}

要比较两个字符串,可以使用compare: 方法,声明如下:

- (NSComparisonResult) compare: (NSString *) aString;

compare: 将接收对象和传递过来的字符串逐个进行比较,它返回一个NSComparisonResult(是一个enum型枚举)来显示比较结果。

enum
{
    NSOrderedAscending = -1,
    NSOrderedSame,
    NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

比较两个字符串是否相等时,应该使用isEqualToString: , 而不能仅仅比较字符串的指针值:

if ([thing1 isEqualToString: thing2])
{
    NSLog (@"the strings are the same!");
}

不同于

if(thing1 == thing2)
{
    NSLog (@"They are the same object!");
}

这是因为==运算符值判断thing1和thing2的指针数值,而不是它们所指的对象。由于thing1和thing2是不同的字符串,所以第二种比较方法会认为它们是不同的。
因此,如果想检查两个对象(thing1和thing2)是否为同一事物,就应该使用运算符==。如果是想查看是否相等(即这两个字符串是否内容相同),那么使用isEqualToString: 。

类似与C语言的qsort()bsearch(),如果compare:返回的结果是NSorderedAscending,那么左侧数值小于右侧数值,比如[@"aardvark" compare: @"zygote"]将返回NSOrderedAscending。
同样的,[@”zoinks” compare: @”jinkies”]返回NSOrderedDescending。[@”fnord” compare: @”fnord”]返回NSOrderedSame。

不区分大小写的比较

compare: 进行的是区分大小写的比较。就是说,@”Bork”和@”bork”的比较是不会返回NSOrderedSame的。方法compare: optins:则有更多的选择权。

- (NSComparionResult) compare: (NSString *) aString opting: (NSStringCompareOptions) mask;

options参数是一个掩位码。可以使用位或bitwise-OR运算符( | )来添加选项标记。常用选项如下:

NSCaseInsensitiveSearch: 不区分大小写字符
NSLiteralSearch: 进行完全比较,区分大小写字符
NSNumbericSearch: 比较字符串的字符个数,而不是字符串值。如果没有这个选项,100会排在99的前面。

//假如想比较字符串,需用忽略大小写并按字符个数进行排序:
if ([thing1 compare: thing2 option: NSCaseInsnsitiveSearch | NSNumbericSearch] == NSOrderedSame)
{
    NSLog (@"They match!");
}

字符串内是否还包含其他字符串

有两个方法能帮忙判断:检查字符串是否一另一个字符串开头,判断字符串是否以另一个字符串结尾:

- (BOOL) hasPrefix: (NSString *) aString;
- (BOOL) hassuffix: (NSString *) aString;

使用方法:

NSString *fileName = @"draft-chapter.pages";

if ([fileName hasPrefix: @"draft"])
{
    // this is a draft
}
if ([fileName hasSuffix: @".mov"])
{
    // this is a movie
}

想知道字符串内是否包含其他字符串,使用rangeOfString:

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

rangeOfString: 发送给一个NSString对象时,传递的参数是要查找的字符串。他返回一个NSRange结构体:

NSRange range = [fileName rangeOfString: @"chapter"];
返回的range.locarion为6,range,length为7。如果传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。

可变性

Cocoa提供一个NSString的子类,叫做NSMuableString,用来改变字符串。
可以使用类方法stringWithCapacity:来创建一个新的NSMutableString:

+ (id) stringWithCapacity: (MSUInteger) capacity;

创建一个新的可变字符串:

NSMutableString *string = [NSMutableString stringWithCapacity: 42];

通过appendString: appendFormat: 来附加新字符串:

- (void) appendString: (NSString *) aString;
- (void) appendFormat: (NSString *) format, ...;

appendString: 接收参数aString, 然后将其复制到接收对象的末尾。appendFormat: stringWithFormat: 类似,但并没用创建新的字符串,而是将格式化的字符串附加在接收字符串的末尾。例如:

NSMutableString *string = [NSMutableString stringWithCapacity: 50];
[string appendString: @"Hello there"];
[string appending: @"human @d!", 39];

最后的结果是string被赋值”Hello there human 39!”

deleteCharactersInRange:方法删除字符串中的字符。

- (void) deleteCharacTERsInRange: (NSRange) aRange;

NSMutableString是NSString的子类,任何使用NSString的地方都可以用NSMutableString替代。与实例方法一样,继承对类方法也同样适用。所以,NSString的类方法stringWithFormat: 也可以用来创建新的NSMutableString对象。

NSMutableString *string = [NSMutableString stringWithFormat: @"jo%dy", 2];

string的初始值是jo2y。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值