黑马程序员——Foundation框架

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

Foundation类层次的根是NSObject类,它(和NSObject及NSCopying协议一起)定义了基本的对象属性和行为。Foundation框架是iOS开发的基础框架,其中包含了很多开发中的数据类型。

结构体

  • NSRange
    NSRange包含两个属性location和length,其实就是定义了一个结构体:
typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;

它有多种创建方式,如下

    NSRange r1 = {1, 5};
    NSRange r2 = {.location = 1, .length = 5};
    NSRange r3 = NSMakeRange(1, 5);

在我们平时的使用中,并不会使用前两种方法,第三种是我们常用的方法。
Range的作用是查找目标的位置及长度,比如某个字符串在另一个字符串中的位置。

NSString *str = @"Hello World!!!";
NSRange range = [str rangeOfString:@"o W"];
NSLog(@"location = %d, length = %d", range.location, range.length);

当找不到这个字符串时,length = 0,location = NSNotFound = -1。

  • NSPoint\CGPoint
    NSPoint定义:
typedef struct _NSPoint {
      CGFloat x;
      CGFloat y;
} NSPoint;

创建方式:

NSPoint p1 = NSPointMake(10,10);
CGPoint p2 = CGMakePoint(10,10);

使用方法:
1、将结构体转为字符串

NSStringFromPoint(NSPoint *p);

2、表示原点

CGPointZero == CGPointMake(0, 0); 

不过在使用CGPointZero等的时候需要添加CoreGraphics框架。
3、比较两点的位置

BOOL b = CGPointEqualToPoint(CGPointMake(5, 3), CGPointMake(3, 5));
  • NSSize\CGSize
    NSSize的定义和用法和NSPoint类似,它的定义为:
typedef struct _NSSize {
    CGFloat width;
    CGFloat height;
} NSSize;

用法同NSPoint,它表示宽和高。

  • NSRect\CGRect
    NSRect是NSPoint和NSSize的结合。
typedef struct _NSRect {
    NSPoint origin;
    NSSize size;
};

用法当然也是同内部两个结构体一样的。

Foundation框架常用类

在开发中常用的类有NSString,NSArray,NSSet,NSDictionary,NSDate。其中NSString、NSArray、NSSet和NSDictionary有可变类,如NSMutableString。

  • NSString和NSMutableString
    NSString用来创建不可变字符串;NSMutableString用来创建可变字符串。
    1、使用NSString来创建字符串:
// 直接创建
NSString *s1 = @"jack";

// 基本已不使用
NSString *s2 = [[NSString alloc] initWithString:@"jack"];

// 通过格式化创建
NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];

// C字符串转化为OC字符串
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];

// OC字符串转化为C字符串
const char *cs = [s4 UTF8String];

// 从文件读取  
NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];

// 由URL创建,两种创建URL的方式
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/alin/Desktop/1.txt"];
NSURL *url = [NSURL fileURLWithPath:@"/Users/alin/Desktop/1.txt"];
NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

在我们的框架中提供了和对象方法对应的类方法,在开发时我们一般使用类方法。
上面是从文件读取字符串,如果想把字符串写进文件,可以如下:

// 字符串写入文件
[@"要写入的字符串" writeToFile:@"/Users/alin/Desktop/my.txt" 
atomically:YES encoding:NSUTF8StringEncoding error:nil];

atomically:YES : 表示如果中途写入失败,文件不会创建,安全性高。NO表示中途写入失败还会创建文件。
2、NSMutableString:代表可变字符串,创建后可以随时改变,与NSString不同的是,NSString里面的字符串一经初始化,就不可改变。如下:

NSMutableString *s1 = [NSMutableString stringWithFormat:@"123"];
// 在字符串后添加字符串
[s1 appendString:@"456"];
// 删除指定范围的字符串”5”
[s1 deleteCharactersInRange:NSMakeRange(4,1)];
// 删除固定字符串”23”
NSRange range = [s1 rangeOfString:@"23"];
[s1 deleteCharactersInRange:range];

// 创建一个新字符串,原来的没改变
NSString *s2 = @"134";
NSString *s3 = [s2 stringByAppendingString:@"678"];
NSLog(@"%@",s3);
  • NSArray和NSMutableArray
    NSArray用来创建不可变数组;NSMutableArray用来创建可变数组。
    1、使用NSArray来创建数组:
// NSArray是不可变数组,所以这个array永远是空数组
// NSArray *array = [NSArray array];

// 通过单个对象创建
NSArray *array2 = [NSArray arrayWithObject:@"alin"];

// 通过多个对象创建,nil是数组元素结束的标记
NSArray *array3 = [NSArray arrayWithObjects:@"alin", @"阿青", nil];

// 快速创建一个NSArray对象
NSArray *array4 = @[@"alin", @"阿青", @"阿婷"];

// 获取数组里面对象的个数
NSLog(@"%ld", array3.count);

// 通过objectAtIndex方法访问
NSLog(@"%@", [array3 objectAtIndex:1]);

// 通过下标快速访问
NSLog(@"%@", array3[0]);

2、NSArray的遍历
*使用for循环遍历:

for (int i = 0; i<array.count; i++)
{
     NSLog(@"%@", array[i]);
}

*使用for(…in…)遍历:

for (id obj in array)
{
     NSLog(@"%@", obj);
}

*使用enumerateObjectsUsingBlock方法遍历:

// 每遍历一个对象,调用一次Block,并且将对象obj和对象的索引idx传递给Block
array enumerateObjectsUsingBlock:
     ^(id obj, NSUInteger idx, BOOL *stop) {
         NSLog(@"%ld---%@", idx, obj);
// 可以控制停止遍历
         if (idx == 1)
         {
             stop = YES;
         }
     }];

3、使用NSMutableArray来创建数组

// 创建NSMutableArray
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];

// 添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];

// 删除所有元素
//[array removeAllObjects];

// 删除指定的对象
// [array removeObject:@"jack"];
[array removeObjectAtIndex:0];

// 错误写法
// [array addObject:nil];

// 错误写法, 因为@[]创建的是NSArray
NSMutableArray *array = @[@"jack", @"rose"];
  • NSSet和NSMutableSet
    1、NSSet和NSArray的对比
    1> 共同点
  • 都是集合,都能存放多个OC对象
  • 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
  • 本身都不可变,都有一个可变的子类
    2> 不同点
  • NSArray有顺序,NSSet没有顺序
    2、NSSet的使用:
NSSet *s = [NSSet set];
// 创建
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];

// 随机拿出一个元素
NSString *str =  [s2 anyObject];

// 输出每个元素
NSLog(@"%@", str);

// 元素个数
NSLog(@"%ld", s2.count);

3、NSMutableSet的使用

NSMutableSet *s = [NSMutableSet set];

    // 添加元素
    [s addObject:@"hack"];

    // 删除元素
    [s removeObject:<#(id)#>];
  • NSDictionary和NSMutableDictionary
    NSDictionary里面的每个对象都有一个key,要找到某个对象,只需知道它的key值。和NSSet一样,字典是无序的。
    1、下面我们对NSArray、NSSet和NSDicitionary进行对比一下:
    1.NSArray\NSMutableArray
  • 有序
  • 快速创建(不可变):@[obj1, obj2, obj3]
  • 快速访问元素:数组名[i]
    2.NSSet\NSMutableSet
  • 无序
    3.NSDictionary\NSMutableDictionary
  • 无序
  • 快速创建(不可变):@{key1 : value1, key2 : value2}
  • 快速访问元素:字典名[key]
    2、NSDictionary的基本使用:
// 创建单个对象
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

// 通过键集合数组和值集合数组创建
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

// 创建多个对象,注意使用nil结束
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
"white-space:pre">                  @"jack", @"name",
"white-space:pre">                  @"北京", @"address",
"white-space:pre">                  @"32423434", @"qq", nil];

// 快速创建方法
 NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};

// 访问对象
 id obj = [dict objectForKey:@"name"];

// 快速访问对象
id obj = dict[@"name"];

NSLog(@"%@", obj);

// 返回的是键值对的个数
NSLog(@"%ld", dict.count);

3、NSMutableDictionary的基本使用:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

// 添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];

// 为相同的key添加对象会覆盖原来的对象
[dict setObject:@"rose" forKey:@"name"];

// 移除键值对
[dict removeObjectForKey:<#(id)#>];

// 错误写法,@{}创建的是不可变字典
NSMutableDictionary *dict2 = @{@"name" : @"jack"};
[dict2 setObject:@"rose" forKey:@"name"];

// 直接输出字典
NSLog(@"%@", dict);

4、字典的遍历

NSDictionary *dict = @{
    @"address" : @"北京",
    @"name" : @"jack",
    @"name2" : @"jack",
    @"name3" : @"jack",
    @"qq" : @"7657567765"};

// 使用for循环遍历
// 取出所有Key
NSArray *keys = [dict allKeys];
for (int i = 0; i.count; i++)
{
           NSString *key = keys[i];
           NSString *object = dict[key];
            NSLog(@"%@ = %@", key, object);
}

// 使用Block遍历,用法和数组Block遍历类似
[dict enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@ - %@", key, obj);
     // 停止遍历
         *stop = YES;
}];
  • NSNumber、NSValue
    1、NSNumber
    NSNumber可以将各种基本数据类型包装成NSNumber对象。
    如下:
// 包装基本数据类型
NSNumber *num = [NSNumber numberWithInt:10];

// 放入集合对象
NSDictionary *dict =  @{
    @"name" : @"jack",
    @"age" : num
};

// 取出NSNumber对象
NSNumber *num2 = dict[@"age"];

// 转换成基本数据类型
int a = [num2 intValue];

NSLog(@"%d" , a);

// 快速包装,@20会自动将@后面的基本数据类型包装成OC对象       
NSArray *array = @[
    @{@"name" : @"jack", @"age" : @20},
    @{@"name" : @"rose", @"age" : @25},
    @{@"name" : @"jim", @"age" : @27}
];

// 将变量包装成NSNumber对象
int age = 100;
@(age);

2、NSValue
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue。
NSValue使用如下:

CGPoint p = CGPointMake(10, 10);
// 将结构体包装成Value对象
NSValue *value = [NSValue valueWithPoint:p];

// 将value转为对应的结构体
[value pointValue];
  • NSDate
    我们一直使用结构体代表日期,比如:
typedef struct {
    int year;
    int month;
    int day;
} Date;

现在我们使用NSDate对象来表示日期,它能为对象增加方法。
1、NSDate基本使用

 // 创建一个时间对象
NSDate *date = [NSDate date];
// 打印出的时候是0时区的时间
NSLog(@"%@", date);

// 使用时间间隔创建
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];

// 从1970开始走过的秒数
NSTimeInterval seconds = [date2 timeIntervalSince1970];

// 从date到现在经过的时间
[date2 timeIntervalSinceNow];

2、日期格式化类

NSDate *date = [NSDate date];

// 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

// y 年  M 月  d 日
// m 分 s 秒  H (24)时  h(12)时
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

// 格式化后的日期转为字符串
NSString *str = [formatter stringFromDate:date];

// 字符串转换为格式化日期
NSString *time = @"2015/01/27 15:32";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm";
NSDate *date = [formatter dateFromString:time];
NSLog(@"%@", date);

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

你可能感兴趣的:(黑马程序员——Foundation框架)