黑马程序员——入学Blog10----Foundation框架常用的结构体与类

来源:互联网 发布:tplink isp数据库 编辑:程序博客网 时间:2024/04/29 10:22
-----------android培训java培训iOS培训、.Net培训、期待与您交流!------------ 
      前面所写的main.m文件都有以下的这句
#import <Foundation/Foundation.h>
      代表着要引入Foundation框架的Foundation.h
/*Foundation.hCopyright (c) 1994-2012, Apple Inc. All rights reserved.*/#include <CoreFoundation/CoreFoundation.h>#import <Foundation/NSObjCRuntime.h>#import <Foundation/NSArray.h>#import <Foundation/NSAutoreleasePool.h>#import <Foundation/NSBundle.h>#import <Foundation/NSByteOrder.h>#import <Foundation/NSCalendar.h>#import <Foundation/NSCharacterSet.h>
          Foundation.h有Foundation框架中定义的各种类的声明,比如NSArray,NSAutoreleasePool。下面就介绍Foundation框架中常用的数据结构
         1.NSRange
typedef struct _NSRange {    NSUInteger location;    NSUInteger length;} NSRange;
typedef unsigned long NSUInteger;  // 无符号长整形
           NS是前缀,range有区间的意思,所以这个结构体表示的是一个以location为起始位置,长度为length的区间
        
         2.NSPoint
typedef CGPoint NSPoint;/* Points. */struct CGPoint {  CGFloat x;  CGFloat y;};typedef struct CGPoint CGPoint;typedef CGFLOAT_TYPE CGFloat;# define CGFLOAT_TYPE double
      Point是点,所以这个结构体是一个二维坐标
    
       3.NSSize
typedef CGSize NSSize;/* Sizes. */struct CGSize {  CGFloat width;  CGFloat height;};typedef struct CGSize CGSize;
     NSSize结构体中的变量类型与NSPoint一样,但从成员变量的命名可以看出,CGSize(NSSize)结构体代表的是矩形的宽度和高度

     4.NSRect
typedef CGRect NSRect;/* Rectangles. */struct CGRect {  CGPoint origin;  CGSize size;};typedef struct CGRect CGRect;
      已知一个顶点坐标与矩形的宽高,那么矩形就被确定了,所以NSRect表示的是一个矩形
//  main.m#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){    @autoreleasepool {        NSRange range = NSMakeRange(1, 1);        NSPoint point = NSMakePoint(10, 20);        NSSize size = NSMakeSize(30, 40);        NSRect rect = NSMakeRect(point.x, point.y, size.width, size.height);        NSLog(@"断点");    }    return 0;}



        5.NSString类
         字符串是用途很广泛的数据类型,所以OC中定义字符串的方法就不止一种。
    @autoreleasepool {        NSRange range = NSMakeRange(1, 1);        NSString *str1 = @"直接赋值";        NSString *str2 = [[NSString alloc] initWithString:str1]; // 利用对象方法        NSUInteger i = 5;        NSString *str3 = [NSString stringWithFormat:@"变量%ld + 字符串组合",i];        NSLog(@"断点");    }

断点查看
       
       还有其它很多种途径可以创建一个NSString对象,通过文件,通过URL等等。
//  main.m#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){    @autoreleasepool {        NSRange range = NSMakeRange(1, 1);        NSString *str1 = @"直接赋值";        NSString *str2 = [[NSString alloc] initWithString:str1]; // 利用对象方法        NSUInteger i = 5;        NSString *str3 = [NSString stringWithFormat:@"变量%ld + 字符串组合",i];        NSString *str4 = @"test";        // 字符串截取        NSString *substr1 = [str1 substringFromIndex:1];        NSString *substr4 = [str4 substringFromIndex:1];        NSString *substr3 = [str3 substringWithRange:range]; // 根据指定区间截取字符串        NSLog(@"substr1 = %@, substr2 = %@",substr1,substr4);                // 取得字符串指定索引的元素值        unichar charstr2 = [str2 characterAtIndex:1];        NSLog(@"charstr2 = %c",charstr2);                // 字符串的替换        NSString *str5 = [str1 stringByReplacingOccurrencesOfString:@"直接" withString:@"hello"];        NSLog(@"字符串str5= %@",str5);                // 字符串的大小写转换        NSString *str6 = [str4 uppercaseString];        NSString *str7 = [str6 lowercaseString];                // 字符串首字母大写        NSString *str8 = [str4 capitalizedString];        NSLog(@"str6 = %@,str7 = %@,str8 = %@",str6,str7,str8);                // 比较两个字符串内容是否相同        BOOL isEqual = [str1 isEqualToString:str2];        NSLog(@"str1与str2字符串内容是否相同?%d",isEqual);                // 两个字符串的大小比较        [str2 compare:str4];        // - (NSComparisonResult)compare:(NSString *)string;        // typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};        // 比较的结果是个枚举值{-1,0,1}                // 判断字符串是否已指定字符串结尾        BOOL isApp = [str1 hasSuffix:@".app"];        NSLog(@"是否APP?%@",isApp?@"是":@"不是");                // 字符串搜索        NSRange range2 = [str3 rangeOfString:substr3];        NSLog(@"range2.location = %ld,rang2.length = %ld",range2.location,range2.length);                // 根据指定字符分割字符串        NSArray *ary = [@"a,b,c,d,e,f,g" componentsSeparatedByString:@","];        // 利用Block迭代数组        [ary enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {            NSLog(@"%@",obj);        }];        NSLog(@"断点");    }    return 0;}
运行结果:
            
        分析:字符串的字串的计数不是按字符,而是按字数的,hasSuffix方法可以用来判断文件类型,NSString是不可变对象,也就是初始化是什么值,后面不会被改变。
      6.NSMutableString类
        可变的字符串类。
        NSMutableString *mstr = [[NSMutableString alloc] initWithString:@"mutableString"];        // 添加字符串        [mstr appendFormat:@" hello"];        [mstr appendString:@" world"];

       7.NSArray及NSMutableArray类
        NSArray *array1 = @[@"1",@"2",ary];        // 数组元素可以是不同对象        NSArray *array2 = [[NSArray alloc] init];  // 空数组        NSArray *array3 = [[NSArray alloc] initWithArray:array1];  // 利用数组对象初始化数组        NSArray *array4 = [[NSArray alloc] initWithObjects:@"3",@"4", nil]; // nil是数组结束标志                // 获取元素个数        NSLog(@"array1有%ld个数组元素",[array1 count]);                // 获取数组指定下标的元素        NSLog(@"数组array1中下标为1的元素为%@",[array1 objectAtIndex:1]);        

运行结果:
           


          NSArray和NSString一样都是不可变对象,而且NSArray也有一个对应的可变数组NSMutableArray
@interface NSMutableArray : NSArray
          NSMutableArray类是NSArray对象的子类。
// 初始化可变数组        NSMutableArray *marray1 = [[NSMutableArray alloc] initWithArray:array1]; // 用NSArray对象初始化NSMutableArray对象        NSMutableArray *marray2 = [[NSMutableArray alloc] initWithObjects:@"123", nil];                // 添加元素到数组中        [marray2 addObject:@"a"];        NSLog(@"marray2 = %@",marray2);                // 判断元素是否在数组中        BOOL isContains = [marray2 containsObject:@"123"];        NSLog(@"marray2数组中是否包含OC字符串123?%@",isContains?@"在":@"不在");                // 将元素插入数组指定位置        [marray2 insertObject:@"456" atIndex:1];         NSLog(@"marray2 = %@",marray2);
运行结果:



     添加的数组元素默认会添加到数组的最后

       8.NSSet类
        NSSet和NSArray有相似之处,都能存储不同的对象的地址,不过NSArray是有序的,NSSet是无序的
        NSSet *set1 = [NSSet set];    // 创建一个空的Set对象        NSSet *set2 = [NSSet setWithArray:array1]; // 用数组作为参数创建一个Set对象        NSSet *set3 = [NSSet setWithObject:@"123"]; // 用对象作为参数创建一个Set对象        // 输出set2对象包含几个元素        NSLog(@"%ld",[set2 count]);                // 判断元素是否在Set中        BOOL isInSet = [set3 containsObject:@"1234"];        NSLog(@"OC字符串1234是否在set3对象中? %@",isInSet?@"包含":@"不包含");                // 返回Set对象中的一个元素,如果Set对象为空则返回nil        id s = [set2 anyObject];        NSLog(@"%@",s);                // 判断连个Set对象是否相同        BOOL isEqual2 = [set1 isEqualToSet:set2];        NSLog(@"set1与set2是否相同?%@",isEqual2?@"相同":@"不相同");
运行结果:

   
     9. NSDictionary类
      字典以键值对作为其中的元素,可以通过键(Key),快速得到值(Value)。
NSArray *province = [[NSArray alloc] initWithObjects:@"浙江",@"湖南",@"福建", nil];        NSArray *city = [[NSArray alloc] initWithObjects:@"杭州",@"长沙",@"福州", nil ];        NSDictionary *provincialCity = [[NSDictionary alloc] initWithObjects:city forKeys:province]; // key:省名 value:省会        // 遍历        [provincialCity enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {            NSLog(@"%@的省会是%@",key,obj);        }];        // 返回一个数组,其中包含所有的键        [provincialCity allKeys];                // 返回一个数组,其中包含所有的值        [provincialCity allValues];                // 根据key值返回value        id v = [provincialCity objectForKey:@"浙江"];        NSLog(@"%@",v);        // 初始化一个可变字典        NSMutableDictionary *mprovincialCity = [[NSMutableDictionary alloc] initWithDictionary:provincialCity];                // 添加一个键值对        [mprovincialCity setObject:@"武汉" forKey:@"湖北"];        NSLog(@"%@",mprovincialCity);                // 删除一个键值对        [mprovincialCity  removeObjectForKey:@"湖北"];        NSLog(@"%@",mprovincialCity);
运行结果:



     

 



0 0