Objective-C学习笔记(一)------Foundation Kit快速学习

这个学习笔记基本上就是例子的集合,讲解的还是需要多看看相关的书籍,以下所有代码都是在xcode4.5下编译通过。

一、常用的数据类型

NSRange用来表示相关事物的范围,通常是字符串里的字符范围或者是数组里的元素范围。其定义如下

老版本定义:

typedef struct _NSRange{

   unsigned int location;

   unsigned int length;

}NSRange;

新版本定义

typedef unsigned long NSUInteger;

typedef struct _NSRange {

    NSUInteger location;

    NSUInteger length;

} NSRange;


下面这个是NSRange结合NSString的一个例子:

int main(int argc,const char * argv[])
{
    
    NSString *string = @"Objective-C is a cool language.";
    
    NSRange range = {17,4};    
    
    NSLog([string substringWithRange:range]);
   
  }

其他常用的结构体:NSPoint,NSRect,NSSize。。。。

二、字符串NSString和NSMutableString

NSString是不可变的,NSSMutableString是不可变的,NSSMutableString是NSString的子类。

下面的例子展示了他们的一些基本用法:

int main(int argc,const char * argv[])
{
    
    NSString *string = @"Objective-C is a cool language.";
    
    NSRange range = {17,4};    
    
    NSLog([string substringWithRange:range]);
   
    
    NSString *str;
    str = [NSString stringWithFormat:@"you height is %d feet,%d inches",5,11];
    NSLog(str,nil);

    NSString *str2 = @"this is a string!";
    if(![str isEqualToString: str2]){
        NSLog(@"The strings are not same!");
    }
    if([str hasPrefix:@"you"]){
        NSLog(@".....");
    }

    NSRange range2;
    range2 = [str rangeOfString:@"feet"];
    NSLog(@"range.location:%ld,range.length:%ld",range2.location,range2.length);

    NSMutableString *mstr;
    mstr = [NSMutableString stringWithCapacity:22];
    [mstr appendString:@"hello "];
    [mstr appendFormat:@"world!%d",1];
    NSLog(mstr,nil);
    [mstr deleteCharactersInRange:NSMakeRange(12, 1)];
    NSLog(mstr,nil);
 
     return (0);

}

三、集合类

集合类只能存储Objective-C的对象,不能储存C语言中的基本数据类型,如int,float

1.NSArray和NSMutableArray

NSArray是不可变数组,NSMutableArray是可变数组。不可变的意思是在初始化之后不能添加和删除任何元素,但是数组中包括的对象是可以改变的。

int main(int argc,const char * argv[])
{
    NSArray *array;
    array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
    //根据索引取数组中的对象
    int i;
    for(i = 0;i < [array count];i++){
        NSLog(@"index %d has %@",i,[array objectAtIndex:i]);
    }
    return (0);
}

2.NSEnumberator和快速迭代

NSEnumberator需要先向数组请求枚举器:-(NSEnumberator *)objectEnumberator;

int main(int argc,const char * argv[])
{
    NSArray *array;
    array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
    //根据索引取数组中的对象
    int i;
    for(i = 0;i < [array count];i++){
        NSLog(@"index %d has %@",i,[array objectAtIndex:i]);
    }
    //通过使用NSEnumberator遍历数组元素
    NSEnumerator * enumerator = [array objectEnumerator];
    
    id thingie;
    while(thingie = [enumerator nextObject]){
        NSLog(@"I found %@" ,thingie);
    }
    //使用快速迭代遍历元素
    for(NSString *string in array){
        NSLog(@"I found %@",string);
    }
}

3.NSDictionary和NSMutableDictionary

字典就是关键字及其定义的集合,在可变字典中关键字须唯一,如果插入的新记录的关键字存在,那么新值会替换原有数值。
int main(int argc,const char * argv[])
{
    NSString *str1 = @"one";
    NSString *str2 = @"two";
    NSString *str3 = @"three";
    
    NSDictionary *dict;
    dict = [NSDictionary dictionaryWithObjectsAndKeys:str1,@"one",str2,@"two",str3,@"three", nil];
    //使用快速迭代
    for(NSString *string in dict){
        NSLog(@"the key is %@,the value is %@",string,[dict objectForKey:string]);
    }
    //使用枚举器遍历
    NSString *string;
    NSEnumerator *enumerator;
    while(string = [enumerator nextObject]){
        NSLog(@"the value is %@",string);
    }

    return (0);

}
4.NSNumber

使用NSNumber类来包装基本数据类型。

int main(int argc,const char * argv[])
{
    NSMutableArray *array;
    NSMutableDictionary *dict;
    NSNumber *number = [NSNumber numberWithInt:20];
    //将对象放入数组和字典中
    [array addObject:number];
    [dict setObject:number forKey:@"Bork"];
    
    //获得基本类型数据
    
    NSLog(@"the number is %d",[number intValue]);

    return (0);

}

5.NSValue

NSValue是NSNumber的父类,可以包装任意值

int main(int argc,const char * argv[])
{
    NSMutableArray *array;
    
    NSRect rect = NSMakeRect(1, 1, 30, 40);
    
    NSValue *value1 = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
    
    [array addObject:value1];
    
    //
    NSValue *value2 = [array objectAtIndex:0];
    [value2 getValue:&rect];

    return (0);

 // NSValue *value3 = [NSValue valueWithRect:rect]; [array addObject:value3];

    return (0);

}

6.综合小例子:查找文件

查找用户主目录下的所有.jpg文件

int main(int argc,const char * argv[])
{
    //创建一个文件管理器,用它来返回一个目录迭代器
    NSFileManager *manager;
    manager = [NSFileManager defaultManager];
    
    //~表示当前用户的主目录,stringByExpandingTildeInPath可以接受~并转换成NSStrng
    NSString *home;
    home = [@"~" stringByExpandingTildeInPath];
    //获得目录迭代器
    NSDirectoryEnumerator *direnum;
    direnum = [manager enumeratorAtPath:home];
    //创建保存文件所需的可变数组,指定长度为30,这个长度并不限制容器的大小,只是个最优值
    NSMutableArray *files;
    files = [NSMutableArray arrayWithCapacity:30];
    //迭代查找后缀为jpg的文件,将文件名储存到filename中
    //pathExtension输出文件的扩展名,不包括前面的“.”
    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);
    }
    return (0);
}


下面这个程序实现了同样的功能,只是简化了

int main(int argc,const char * argv[])
{
    NSFileManager * manager = [NSFileManager defaultManager];
    
    NSString *home = [@"~" stringByExpandingTildeInPath];
    
    NSMutableArray * files = [NSMutableArray arrayWithCapacity:20];
        
    for(NSString *filename in[manager enumeratorAtPath:home]){
        if([[filename pathExtension] isEqualTo:@"jpg"]){
            [files addObject:filename];
        }
    }
    
    for(NSString *filename in files){
        NSLog(@"%@",filename);
    }
    return (0);
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值