新浪微博 有道云笔记 麦库 EverNote Pocket Instapaper 更多

Foundation框架中的数据类型

一、一些有用的数据类型

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"];

posted @ 2012-11-09 21:53  iTeaTime(技术清谈)  阅读(294)  评论(0编辑  收藏  举报