前面所写的main.m文件都有以下的这句
#import <Foundation/Foundation.h>
代表着要引入Foundation框架的Foundation.h
/* Foundation.h
Copyright (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);
运行结果: