zoukankan      html  css  js  c++  java
  • Objective-c 基础框架(初学者-总结)

      一个框架其实就是一个软件包,它包含了多个类。Mac 操作系统提供了几十个框架,主要帮助开发者快速的在Mac 系统上开发应用程序。其中包括一些基础框架,就是为所有程序开发提供基础的框架,其中几个常用的类包括:字符串(NSString), 数字(NSNumber), 数组 (NSArray),字典 (NSDictionary), 集合 (NSSet)等。这几个类都是经常用到的,所以必须很好的掌握,下来我们就来详细介绍这几个类。

      1. 数字对象 (NSNumber)

        为什么要使用数字对象?我们已经熟悉了使用 int 等数据类型生明数字变量,但是因为很多类(比如 NSArray)都要求使用对象,但 int 等声明的数字变量不是对象,所以,无法在这些类中使用。 NSNumber 就是数字对象类。

         下面通过一个例子来演示这个数字对象的用法。

      

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc,const char *argv[]){
     4     @autoreleasepool {
     5         NSNumber *myNumber,*floatNumber,*intNumber,*doubleNumber;
     6         
     7         // 创建 interger 类型对象
     8         intNumber = [NSNumber numberWithInt:1];
     9         NSLog(@"intNumber = %li",[intNumber integerValue]);
    10         
    11         // 创建 long 类型对象
    12         myNumber = [NSNumber numberWithLong:0xababab];
    13         NSLog(@"myNumber = %lx",[myNumber longValue]);
    14         
    15         // 创建  char  类型对象
    16         myNumber = [NSNumber numberWithChar:'c'];
    17         NSLog(@"myNumber = %c",[myNumber charValue]);
    18         
    19         // 创建 float 类型对象
    20         floatNumber = [NSNumber numberWithFloat:3.14];
    21         NSLog(@"floatNumber = %f",[floatNumber floatValue]);
    22         
    23         // 创建 double 类型对象
    24         doubleNumber = [NSNumber numberWithDouble:3.11];
    25         NSLog(@"doubleNumber = %lg",[doubleNumber doubleValue]);
    26         
    27         // 判断两个对象的值是否相等
    28         if ([intNumber isEqualToNumber:floatNumber])
    29             NSLog(@"intNumber = floatNumber");
    30         else
    31             NSLog(@"intNumber != floatNumber");
    32         
    33         // 比较两个对象的值大小
    34         if ([intNumber compare:floatNumber] == NSOrderedAscending)
    35             NSLog(@"左边的数字小");
    36         else
    37             NSLog(@"右边的数字小");
    38     }
    39     return 0;
    40 }

      2. 字符串对象

       字符串常量是由一个@的符号和一对双引号括起来的字符序列。例如:@"hello world"。字符常量字符串常量是不同的量,它们的区别主要有以下3种:

        1. 字符是由单引号括起来的,而字符串常量是由@和双引号括起来的。

        2. 字符常量只有一个字符,而字符串常量可以有多个字符。

        3. 字符常量只占一个字节。而字符串常量的字节数是由字符个数加1。  增加的字符个数是结束符''。

      Objective-C 中使用NSString来操作字符串,而不是使用c/c++的char*。它在字符串的前面加一个@符号。比如:@"苹果"。下面通过一个例子来具体表现它在oc中的用法:

      2.1 不可修改的字符串 (NSString)

      

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc,const char *argv[]){
     4     @autoreleasepool {
     5 
     6     // stringWithString 是基于一个字符串创建另外一个字符串对象。
     7     NSString *str1 = @"hello world";
     8     NSString *str2 = [NSString stringWithString:str1];
     9     NSLog(@"str1 = %@ , str2 = %@",str1,str2);
    10     
    11     // NSString 中提供了格式化字符串的方法 stringWithFormat,oc 中用%@来表示一个字符串的值。
    12     NSString *name = @"xiaozhang";
    13     NSString *str3 = [NSString stringWithFormat:@"I am %@",name];
    14     NSLog(@"str3 = %@",str3);
    15     
    16     // 在一个字符串的后面新加一个字符串。
    17     NSString *guilin = @"guilin";
    18     NSString *welcome = [guilin stringByAppendingString:@" welcome you!"];
    19     NSLog(@"%@",welcome);
    20     
    21     // 字符串的比较和判断
    22     BOOL isSame = [str1 isEqualToString:@"str3"];
    23     if(isSame)
    24         NSLog(@"str1 = str2");
    25     else
    26         NSLog(@"str1 != str2");
    27     
    28     NSComparisonResult result = [str1 compare:str2];
    29     if(result == NSOrderedSame)  //内容相同
    30         NSLog(@"str1 == str2");
    31     else if(result == NSOrderedAscending) // 左边 小于 右边
    32         NSLog(@"str1 < str2");
    33     else  //result == NSOrderedDescending // 左边  大于 右边
    34         NSLog(@"str1 > str2");
    35     
    36     // 字符串大小写的转换
    37     NSString *str4 = [str1 uppercaseString]; // 转换为大写
    38     NSString *str5 = [str1 lowercaseString]; // 转换为小写
    39     NSLog(@"str4 = %@,str5 = %@",str4,str5);
    40         
    41     // 字符串的截取
    42     NSString *str6 = [str1 substringToIndex:2];
    43     NSLog(@"str6 = %@",str6);
    44     
    45     // 去除前4个字符串形成新的字符串
    46     NSString *str7 = [str1 substringFromIndex:4];
    47     NSLog(@"str7 = %@",str7);
    48     
    49     // 从某个字符串到某个字符串形成的新的字符
    50     NSString *str8 = [[str1 substringFromIndex:2] substringToIndex:5];
    51     NSLog(@"str8 = %@",str8);
    52         
    53     NSRange rang = [str1 rangeOfString:@"lo"];
    54     NSLog(@"包含字符串开始的位置是%lu,长度是%lu",rang.location,rang.length);
    55         
    56     if([str1 rangeOfString:@"lo"].location == NSNotFound)
    57         NSLog(@"没有找到包含的字符串");
    58     else
    59         NSLog(@"包含字符串开始的位置是%lu,长度是%lu",rang.location,rang.length");
    60     
    61     }
    62     return 0;
    63 }

      2.2 可修改的字符串 (NSMutableString)

      NSString 本身不允许修改,如果要修改的话,可以使用 NSMutableString,NSMutableString 是 NSString 的子类。所有 NSString 都适用于 NSMutableString ,它提供了附加字符串的方法:

      - (void) appendString: (NSString *) string;

      - (void) appendFormat: (NSSting *)string;

      例如:

            NSMutableString *str =[NSMutableString stringWithString:@"Giulin"];

            [str appendString:@"welcome you!"];

      3. 数组对象

       数组是有序的对象集合,一般情况下,数组中的元素都是相同类型的。类似可变字符串和不可变字符串,也有可变数组和不可变数组。 

      3.1 不可变数组 (NSArray)

      NSArray 是数组类,在数组的中的元素必须以 nil 结尾。以下举个例子来说明它的具体用法:

      

      

    #import <Foundation/Foundation.h>

    int main(int argc,const char *argv[]){

        @autoreleasepool {

            NSArray *array = [NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu",@"zhaoliu",nil];

            

            for(int i ; i < [array count] ; i++)

                NSLog(@"%@",[array objectAtIndex:i]);

            

            if([array indexOfObject:@"xiaoli"] == NSNotFound)

                NSLog(@"xiaoli 不在其中!");

        }

        return 0;

    }

    
    
    
     

      3.2 可修改数组 (NSMutableArray)

      NSArray 是静态数组,所以不能往该数组中添加元素,必须使用 NSMutableArray 来动态管理数组。NSMutableArray 是NSArray 的字类。

        

      下面通过具体例子来说明它的具体用法:

      

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , const char *argv[]){
     4     @autoreleasepool {
     5         NSMutableArray *city = [NSMutableArray arrayWithObjects:@"西安",@"北京",@"上海", nil];
     6         [city addObject:@"深圳"];   // 数组中增加一个元素深圳。
     7         [city removeObject:@"上海"]; // 数组中删除一个元素上海。
     8         [city insertObject:@"桂林" atIndex:1]; // 在第一个元素那里插入桂林。
     9         // [city removeAllObjects]; // 删除所有元素。
    10         for(int i ; i < [city count] ; i++)
    11             NSLog(@"%@",[city objectAtIndex:i]);
    12         
    13     }
    14     return 0;
    15     
    16 }

      4. 字典对象 (NSDictionary 和 NSMutableDictionary)

      NSDictionary 提供了 “键-值” 对的集合。比如,使用字典类实现学生学号到姓名的存放,编号是一个键(唯一性),姓名是一个值。它的方法有:

      

       下面举个例子来看其具体的应用:

      

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , const char *argv[]){
     4     @autoreleasepool {
     5         NSDictionary *student = [NSDictionary dictionaryWithObjectsAndKeys:@"xiaohong",@"01",@"xiaoming",@"02",@"xiaoqiang",@"03",nil];
     6         NSLog(@"%@",[student objectForKey:@"01"]); // 查找 01 键对应的值,不存在返回 nil。
     7         NSLog(@"人数:%li",[student count]); // 获得个数。
     8     }
     9     return 0;
    10 }

      同上面介绍的字符串和数组类似,NSDictionary 也是不可修改的字典。可变字典是 NSMutableDictionary,它可以动态的添加和删除元素,它的方法有:

       

       

       下面通过一个具体的例子来简单应用一下:

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , const char *argv[]){
     4     @autoreleasepool {
     5         NSMutableDictionary *student = [NSMutableDictionary dictionary];
     6         [student setObject:@"xiaohong" forKey:@"01"];
     7         [student setObject:@"xiaoming" forKey:@"02"];
     8         [student setObject:@"xiaodong" forKey:@"03"];
     9         
    10         NSLog(@"01: %@",[student objectForKey:@"01"]);
    11         NSLog(@"02: %@",[student objectForKey:@"02"]);
    12         NSLog(@"03: %@",[student objectForKey:@"03"]);
    13         
    14     }
    15     return 0;
    16 }

      4. 集合对象 (NSSet)  

      

      集合对象是一组单值对象的组合,比如 1 个 包含 1 到 50 个数字的集合。集合对象的操作包括搜索,添加,删除集合中的成员,比较 2 个集合,计算两个集合的交集和并集等。在下面的程序中,演示了一些集合的常用方法。

      

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface NSSet (printInteger)
     4 
     5 - (void)printSet;
     6 
     7 @end
     8 
     9 @implementation NSSet (printInteger)
    10 
    11 - (void)printSet{
    12     for (NSNumber *integer in self){
    13         printf("%li",[integer integerValue]);
    14     }
    15     printf("
    ");
    16 }
    17 @end
    18 
    19 int main(int argc , const char * argv[]){
    20     @autoreleasepool {
    21         NSMutableSet *set1 = [NSMutableSet setWithObjects:[NSNumber numberWithInteger:1],[NSNumber numberWithInteger:5],[NSNumber numberWithInteger:3],nil];
    22         
    23         NSMutableSet *set2 = [NSMutableSet setWithObjects:[NSNumber numberWithInteger:7],[NSNumber numberWithInteger:2],[NSNumber numberWithInteger:4],nil];
    24         
    25         if([set1 isEqual:set2] == YES) // 比较两个集合是否相等
    26             NSLog(@"set1 = set2");
    27         else
    28             NSLog(@"set1 != set2");
    29         
    30         if([set1 containsObject:[NSNumber numberWithInteger:2]] == YES) // 判断该集合是否包含某一元素
    31             NSLog(@"set1 包含2");
    32         else
    33             NSLog(@"set1 不包含2");
    34         
    35         [set1 addObject:[NSNumber numberWithInteger:6]];  // 向集合中添加元素
    36         [set1 removeObject:[NSNumber numberWithInteger:6]]; // 删除某个元素
    37         
    38         [set1 intersectSet:set2];  // 计算2个集合的交集
    39         [set1 unionSet:set2]; // 计算2个集合的并集
    40         [set1 printSet];
    41     }
    42     return  0;
    43 }

      5. 枚举访问

      对于数组,字典和集合,Objective-C 提供了枚举方法来访问各个元素,具体方法有两种。

       方法 1:

      

       方法2:

        

      第二种方法简洁,所以经常用第二种方法,一般称第二种方法为快速枚举。下面举一个字典快速枚举的例子:代码定义了一个NSString 类型的对象,用来保存每次取出来的健值,然后基于取出的键,调用字典对象student的objectForKey:方法将 值 也取出来,并打印到控制台上。

      

     1  #import <Foundation/Foundation.h>
     2 
     3  int main(int argc , const char *argv[]){
     4         @autoreleasepool {
     5                 NSMutableDictionary *student = [NSMutableDictionary dictionary];
     6                 [student setObject:@"xiaohong" forKey:@"01"];
     7                 [student setObject:@"xiaoming" forKey:@"02"];
     8                 [student setObject:@"xiaodong" forKey:@"03"];
     9     
    10                 for(NSString *key in student)  
    11                     NSLog(@"%@:%@",key,[student objectForKey:key]);
    12     }
    13     return 0;
    14 }
  • 相关阅读:
    递归算法转换为非递归算法的技巧
    22. 平面列表
    14. 二分查找
    那点人生小智慧
    9. Fizz Buzz 问题
    8. 旋转字符串
    6. 合并排序数组:
    归并排序
    远方的她
    微服务体系下如何快速构建一个服务
  • 原文地址:https://www.cnblogs.com/xiaozhai-1234/p/5237058.html
Copyright © 2011-2022 走看看