OC-基础数据类型
七 | 字符串与基本数据类型转换 | 获取字符串的每个字符/字符串和其他数据类型转换 |
八 | NSMutableString | 基本概念/常用方法 |
九 | NSArray | NSArray基本概念/创建方式/注意事项/常用方法简写形式/遍历/排序/文件读写/NSArray 与字符串 |
十 | NSMutableArray | 概念/基本用法/错误用法 |
十一 | NSDictionary | 基本概念/创建/遍历/文件操作 |
十二 | NSMutableArray | NSMutableDictionary 基本概念/常用方法/简写/NSDictionary和NSArray对比 |
十三 | OC中的结构体 | NSPoint和CGPoint/NSSize和CGSize/NSRect和CGRect/常见的结构体使用注意 |
十四 | NSNumber | NSNumber基本概念/创建/从NSNumber对象中的到基本类型数据 |
十五 | NSValue | NSValue基本概念/常见结构体的包装/任意数据的包装 |
十六 | NSDate | NSDate基本概念/格式化日期/日期时间对象 |
七.字符串与基本数据类型转换
1.
- (NSUInteger)length;
- 返回字符串的长度(有多少个文字)
- (unichar)characterAtIndex:(NSUInteger)index;
- 返回index位置对应的字符
2.字符串和其他数据类型转换
- 转为基本数据类型
- - (double)doubleValue;
- - (float)floatValue;
- - (int)intValue;
NSString *str1 = @"110";
NSString *str2 = @"10";
int res = str1.intValue + str2.intValue;
NSLog(@"res = %i", res); NSString *str1 = @"110";
NSString *str2 = @"10.1";
double res = str1.doubleValue + str2.doubleValue;
NSLog(@"res = %f", res);
- 转为C语言中的字符串
- - (char *)UTF8String;
NSString *str = @"abc";
//用常量接收,所以用const
const char *cStr = [str UTF8String];
NSLog(@"cStr = %s", cStr);
- C语言字符串转为OC字符串
char *cStr = "abc";
NSString *str = [NSString stringWithUTF8String:cStr];
NSLog(@"str = %@", str);
- 注意:
- 如果不是int.double.float.bool.integer.longlong这些类型就不要乱用
八. NSMutableString
- 只要带Mutable:可变的
概念
1.NSMutableString 基本概念
NSMutableString类继承NSString类,那么NSString提�t�供的方法在NSMutableString中基本都可以使用,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符串/删除字符串 /指定位置插入字符串,使用它来操作字符串会更加灵活。
NSMutableString和NSString的区别
- NSString是不可变的, 里面的文字内容是不能进行修改的 + NSMutableString是可变的, 里面的文字内容可以随时更改
- NSMutableString能使用NSString的所有方法
2.字符串中的可变和不可变
- 不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
// 改变了指针的指向, 并没有修改字符串
NSString *str = @"lnj";
str = @"lmj"; // 生成了一个新的字符串, 并没有修改字符串
NSString *newStr = [str substringFromIndex:1];
NSLog(@"str = %@", str);
NSLog(@"newStr = %@", newStr);
- 可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改
//strM是空的字符串
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
// 修改原有字符串, 没有生成新的字符串
[strM appendString:@"lnj"];
NSLog(@"strM = %@", strM);
[strM appendString:@" v587"];
NSLog(@"strM = %@", strM);
- 常用的是stringWithFormat
常用方法
- 这些方法都是没返回值的
1.NSMutableString常用方法
- - (void)appendString:(NSString *)aString;
- 拼接aString到最后面
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
[strM appendString:@"lnj"];
NSLog(@"strM = %@", strM);
- - (void)appendFormat:(NSString *)format, ...;
- 拼接一段格式化字符串到最后面
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
[strM appendFormat:@"lnj"];
NSLog(@"strM = %@", strM);
- - (void)deleteCharactersInRange:(NSRange)range;
- 删除range范围内的字符串
- 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容
NSMutableString *strM = [NSMutableString stringWithString:@"http://www.520it.com"]; //查找http://的位置
NSRange range = [strM rangeOfString:@"http://"];
//删除查找到的http://
[strM deleteCharactersInRange:range];
NSLog(@"strM = %@", strM);
- - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
- 在loc这个位置中插入aString
- insertString:需要插入的字符串
- atIndex:插入的位置
NSMutableString *strM = [NSMutableString stringWithString:@"www.520it.com"];
[strM insertString:@"http://" atIndex:0];
NSLog(@"strM = %@", strM);
- - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
- 使用aString替换range范围内的字符串
- OccurrencesOfString:需要替换的字符串
- withString:用什么替换
- options:替换时的搜索方式
- range:搜索的范围
- 返回值:代表替换的字符串的个数
NSMutableString *strM = [NSMutableString stringWithString:@"http://www.520it.com/hmj.png"];
NSRange range = [strM rangeOfString:@"hmj"];
[strM replaceOccurrencesOfString:@"hmj" withString:@"jjj" options:0 range:range];
NSLog(@"strM = %@", strM);
2.字符串使用注意事项
- @”lnj”这种方式创建的字符串始终是NSString,不是NSMutalbeString.所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。
NSMutalbeString *s1 = @”hmj”;
// 会报错
[strM insertString:@"my name is " atIndex:0];
- 如果调用NSString的字符串替换方法,不会修改原有的字符串,而是产生一个新的字符串
- 一般情况下,OC方法要求传入一个参数如果没有*,大部分是枚举,一般情况下如果不想用枚举的值,可以传入0,代表按照系统默认的方式处理
练习
将3个520it拼接在一起,中间用空格隔开
NSString *subStr = @"520it";
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < 3; ++i) {
// 1.添加一个520it
[strM appendString:subStr];
// 2.添加一个空格
[strM appendString:@" "];
}
[strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
NSLog(@"strM = |%@|", strM);
- 在开发中如果对字符串做频繁操作,不要用不可变字符串
九. NSArray
- 只能加入对象类型
1.NSArray的基本概念
什么是NSArray?
- NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组
- C语言中数组的弊端
- int array[4] = {10, 89, 27, 76};
- 只能存放一种类型的数据.(类型必须一致)
- 不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)
NSArray的使用注意
- 只能存放任意OC对象, 并且是有顺序的
- 不能存储非OC对象,比如int\float\double\char\enum\struct等
- 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素
2.NSArray的创建方式
- + (instancetype)array;
- + (instancetype)arrayWithObject:(id)anObject;
- + (instancetype)arrayWithObjects:(id)firstObj, ...;
+ (instancetype)arrayWithArray:(NSArray *)array;根据数组创建数组
+ (id)arrayWithContentsOfFile:(NSString *)path;
- + (id)arrayWithContentsOfURL:(NSURL *)url;
3.NSArray 的使用注意事项
NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。
NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。
NSArray *arr = [NSArray arrayWithObjects:@"hmj", nil ,@"hyh",@"hxj", nil];
NSLog(@"%@", arr);
输出结果:
(
hmj
)
4.NSArray的常用方法
- (NSUInteger)count;
- 获取集合元素个数
- (id)objectAtIndex:(NSUInteger)index;
- 获得index位置的元素
- (BOOL)containsObject:(id)anObject;
- 是否包含某一个元素
- 包含就返回1
- 不包含就返回0
- 是否包含某一个元素
- (id)lastObject;
- 返回最后一个元素
- (id)firstObject;
- 返回第一个元素
- (NSUInteger)indexOfObject:(id)anObject;
- 查找anObject元素在数组中的位置(如果找不到,返回-1)
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
- 在range范围内查找anObject元素在数组中的位置
5.NSArray的简写形式
自从2012年开始,Xcode的编译器多了很多自动生成代码的功能,使得OC代码更加精简
数组的创建
+ 之前
[NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil];
+ 现在
@[@"Jack", @"Rose", @"Jim"];
- 数组元素的访问
+ 之前
[array objectAtIndex:0];
+ 现在
array[0];
NSArray 遍历
1.NSArray的下标遍历
NSArray *arr = @[p1, p2, p3, p4, p5];
for (int i = 0; i < arr.count; ++i) {
Person *p = arr[i];
[p say];
}
2.NSArray的快速遍历
- forin(增强for循环)
- 逐个取出arr中的元素,将取出的元素赋值给obj
- 注意
- obj的类型可以根据数组中元素的类型来写,不一定要写NSObject
NSArray *arr = @[p1, p2, p3, p4, p5];
for (Person *p in arr) {
[p say];
}
3.NSArray 使用block进行遍历
- OC数组的迭代器
- 每取出一次就会调用block都会将当前取出的元素对应索引传递给我们
- stop用于控制遍历的停止
- 当*stop = YES时,遍历就会停止
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"obj = %@, idx = %lu", obj, idx);
Person *p = obj;
[p say];
}];
- 如果使用OC数组存储对象,可以钓鱼OC数组的方法让数组中所有的元素都执行指定的方法
- 注意点
- 如果数组中保存的不是相同类型的数据,并没有相同的方法,那么会报错
4.NSArray给所有元素发消息
- 让集合里面的所有元素都执行aSelector这个方法
- - (void)makeObjectsPerformSelector:(SEL)aSelector;
- - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
// 让数组中所有对象执行这个方法
// 注意: 如果数组中的对象没有这个方法会报错
// [arr makeObjectsPerformSelector:@selector(say)];
[arr makeObjectsPerformSelector:@selector(eat:) withObject:@"bread"];
NSArray排序
1.NSArray排序
- Foundation自带类排序
- 注意
- 想要使用哪个compare方法对数组中元素进行排序,那么数组中的元素必须是Foundation框架中的对象,也就是说不能是自定义对象
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *arr = @[@1, @9, @5, @2];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
- 自定义类排序
- 不能用compare:方法进行排序
NSArray *arr = @[p1, p2, p3, p4, p5];
// 默认按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// return obj1.age > obj2.age;//升序
return obj1.age < obj2.age;//降序
}];
NSLog(@"%@", newArr);
NSArray和NSString之间的转换
- 字符串拼接
NSArray *arr = @[@"hmj", @"hyh", @"good"];
NSString *str = [arr componentsJoinedByString:@"*"];
NSLog(@"str = %@", str);
- 字符串切割
NSArray *arr = @"hmj**hyh**good";
NSString *str = [arr componentsSeparatedByString:@"**"];
NSLog(@"str = %@", str);
NSArray文件读写
1.NSArray数据写入到文件中
- 数据写入到文件中实质是写入一个XML文件
- 在iOS开发中一般情况下,会将XML文件的扩展名保存为plist
- 注意
- writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象,如果保存的是自定义的对象那么不能写入
NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq"];
BOOL flag = [arr writeToFile:@"/Users/MJ-Hee/Desktop/persons.plist" atomically:YES];
NSLog(@"%i", flag);
2.从文件中读取数据到NSArray中
NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/MJ-Hee/Desktop/persons.xml"];
NSLog(@"%@", newArr);
NSArray 与字符串
1.把数组元素链接成字符串
- - (NSString )componentsJoinedByString:(NSString )separator;
- 这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串
NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq"];
NSString *res = [arr componentsJoinedByString:@"*"];
NSLog(@"res = %@", res);
输出结果:
lnj*lmj*jjj*xcq
2.字符串分割方法
- - (NSArray )componentsSeparatedByString:(NSString )separator;
- 这是NSString的方法,将字符串用separator作为分隔符切割成数组元素
NSString *str = @"lnj-lmj-jjj-xcq";
NSArray *arr = [str componentsSeparatedByString:@"-"];
NSLog(@"%@", arr); 输出结果:
(
lnj,
lmj,
jjj,
xcq
)
十.NSMutableArray
1.NSMutableArray介绍
- 什么是NSMutableArray
- NSMutableArray是NSArray的子类
- NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
- NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
2.NSMutableArray基本用法
- 创建空数组
NSMutableArray *arr = [NSMutableArray array];
- 创建数组,并且指定长度为5,此时也是空数组
NSMutableArray *arr2 = [[NSMutableArray alloc] initWithCapacity:5];
- 创建一个数组,包含两个元素
NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
- 调用对象方法创建数组
NSMutableArray *arr4 = [[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
- (void)addObject:(id)object;
- 添加一个元素
- (void)addObjectsFromArray:(NSArray *)array;
- 添加otherArray的全部元素到当前数组中
- 将指定数组中的元素都取出来,放入调用该方法的数组中,并不是将整个数组作为一个元素添加到调用该方法的数组中
- addObjects:@[@"str1", @"str2"];将真个数组作为一个元素添加到调用该方法的数组中
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
- 在index位置插入一个元素
- (void)indexSetWithIndexesInRange:(NSRange *)range;
- 制定插入位置和插入多少
- (void)removeLastObject;
- 删除最后一个元素
- (void)removeAllObjects;
- 删除所有的元素
- (void)removeObjectAtIndex:(NSUInteger)index;
- 删除index位置的元素
- (void)removeObject:(id)object;
- 删除特定的元素
- (void)removeObjectsInRange:(NSRange)range;
- 删除range范围内的所有元素
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
- 用anObject替换index位置对应的元素
- 可以直接替换:arrM[0] = @"HMJ"
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
- 交换idx1和idx2位置的元素
- -(void)objectAtIndex:(int)index;
- 获取元素
- arrM[index];也可以获取元素
3.NSMutableArray 错误用法
- 不可以使用@[]创建可变数组
NSMutableArray *array = @[@"hmj", @"hyh", @"hhh"];
// 报错, 本质还是不可变数组
[array addObject:@“Peter”];
十一.NSDictionary
1.NSDictionar基本概念
- 什么是NSDictionary
- NSDictionary翻译过来叫做”字典”
- NSDictionary的作用类似:通过一个key,就能找到对应的value
- NSDictionary是不可变的,一旦初始化完毕,里面的内容就无法修改
2.NSDictionary的创建
+ \+ (instancetype)dictionary;
+ \+ (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
+ \+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
+ \+ (id)dictionaryWithContentsOfFile:(NSString *)path;
+ \+ (id)dictionaryWithContentsOfURL:(NSURL *)url;
+ \- (void)dictionaryWithObject:(NSString *) forKey:(NSString *);
* 单个数据
+ \- (void)dictionaryWithObjects:(NSArray *) forKey:(NSA rray *);
* 多个数据
- 创建键值对
- NSDictionary *dict = @{@"name": @"hmj" };
- NSDictionary *dict = @{@"name": @"hmj", @"age": @"23", @"height"; @"1.69" };
- NSDictionary创建简写
+ 以前
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"lnj", @"name", @"12345678", @"phone", @"天朝", @"address", nil];
+ 现在
NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
- NSDictionary获取元素简写
+ 以前
[dict objectForKey:@"name”];
+ 现在
dict[@"name”];
- 键值对集合的特点
- 字典存储的时候,必须是"键值对"的方式来存储(同时键不要重复)
- 键值对中存储的数据是"无序的".
- 键值对集合可以根据键, 快速获取数据.
3.NSDictionary的遍历
- (NSUInteger)count;
- 返回字典的键值对数目
- (id)objectForKey:(id)aKey;
- 根据key取出value
如果获取字典中key和value的个数,键值对
- [字典名称 count];得到的是键值对的对数
for (int i = 0, i< dict.count, ++i){
//获取所有的key
NSArray *keys = [dict allKeys];
//取出当前位置对应的key
NSString *key = keys[i];
NSString *value = dict[key];
NSLog(@"key = %@, value = %@", key, value);
} for (NSString *key in dict){
NSString *value = dict[key];
NSLog(@"key = %@, value = %@", key, value);
} [dict enumrateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
NSLog(@"key = %@, value = %@", key, obj);
}];
- 快速遍历
NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
for (NSString *key in dict) {
NSLog(@"key = %@, value = %@", key, dict[key]);
}
- Block遍历
[dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
NSLog(@"key = %@, value = %@", key, obj);
}];
4.NSDictionary文件操作
将字典写入文件中
- - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
- 存结果是xml文件格式,但苹果官方推荐为plist后缀。
示例
NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
BOOL flag = [dict writeToFile:@"/Users/LNJ/Desktop/dict.plist" atomically:YES];
NSLog(@"flag = %i", flag);
- 从文件中读取字典
NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/LNJ/Desktop/dict.plist"];
NSLog(@"newDict = %@", newDict);
十二.NSMutableDictionary
1.NSMutableDictionary 基本概念
- 什么是NSMutableDictionary
- NSMutableDictionary是NSDictionary的子类
- NSDictionary是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素, 也不能再往里面添加元素
- NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素
2.NSMutableDictionary的常见操作
- (void)setObject:(id)anObject forKey:(id )aKey;
- 添加一个键值对(会把aKey之前对应的值给替换掉)
- (void)removeObjectForKey:(id)aKey;
- 通过aKey删除对应的value
- (void)removeAllObjects;
- 删除所有的键值对
3.NSMutableDictionary的简写
- 设置键值对
- 以前
[dict setObject:@"Jack" forKey:@"name”];
- 现在
dict[@"name"] = @"Jack";
- 以前
4.NSDictionary和NSArray对比
NSArray和NSDictionary的区别
- NSArray是有序的,NSDictionary是无序的
- NSArray是通过下标访问元素,NSDictionary是通过key访问元素
NSArray的用法
- 创建
@[@"Jack", @"Rose"] (返回是不可变数组)
- 访问
id d = array[1];
- 赋值
array[1] = @"jack";
- 创建
NSDictionary的用法
- 创建
@{ @"name" : @"Jack", @"phone" : @"10086" } (返回是不可变字典)
- 访问
id d = dict[@"name"];
- 赋值
dict[@"name"] = @"jack";
- 创建
添加
- 会将传入字典中的所有的键值对取出来添加到dict中
注意
- 不能通过@{}创建一个可变的字典
- 简单创建的都是不可变的
- 如果是不可变数组,那么key不能相同
- 如果是不可变字典出现了同名的key,那么后面的key对应的值不会被保存
- 如果是在可变字典中,后面的会覆盖前面的值
十三.OC中的结构体
1.NSPoint和CGPoint
- CGPoint和NSPoint是同义的
typedef CGPoint NSPoint; CGPoint的定义
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
- CGPoint代表的是二维平面中的一个点
- 可以使用CGPointMake和NSMakePoint函数创建CGPoint
2.NSSize和CGSize
- CGSize和NSSize是同义的
typedef CGSize NSSize; CGSize的定义
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
- CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
- 可以使用CGSizeMake和NSMakeSize函数创建CGSize
3.NSRect和CGRect
- CGRect和NSRect是同义的
typedef CGRect NSRect; CGRect的定义
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
- CGRect代表的是二维平面中的某个物体的位置和尺寸
- 可以使用CGRectMake和NSMakeRect函数创建CGRect
4.常见的结构体使用注意
- 苹果官方推荐使用CG开头的:
- CGPoint
- CGSize
- CGRect
- 注意点
- OC中创建结构体的方法都是以NSMake开头
- 在开发中使用CG开头的结构体,也就说NS开头的结构体一般不用
- 对象.成员变量来获取结构体的数据
十四.NSNumber
- 注意
- 如果传入的是变量,那么必须在@后面写() ,如果传入的是常量,那么@后面的()可以省略
1.NSNumber基本概念
NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类
如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象
NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中
2.NSNumber的创建
以前
- + (NSNumber *)numberWithInt:(int)value;
- + (NSNumber *)numberWithDouble:(double)value;
- + (NSNumber *)numberWithBool:(BOOL)value;
现在
- @10;
- @10.5;
- @YES;
- @(num);
3.从NSNumber对象中的到基本类型数据
- - (char)charValue;
- - (int)intValue;
- - (long)longValue;
- - (double)doubleValue;
- - (BOOL)boolValue;
- - (NSString *)stringValue;
- - (NSComparisonResult)compare:(NSNumber )otherNumber; - - (BOOL)isEqualToNumber:(NSNumber )number;
十五.NSValue
1.NSValue基本概念
NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
NSValue可以包装任意值
- 因此,可以用NSValue将结构体包装后,加入NSArray\NSDictionary中
2. 常见结构体的包装
- 为了方便结构体和NSValue的转换,Foundation提供了以下方法
将结构体包装成NSValue对象
- + (NSValue *)valueWithPoint:(NSPoint)point;
- + (NSValue *)valueWithSize:(NSSize)size;
- + (NSValue *)valueWithRect:(NSRect)rect;
从NSValue对象取出之前包装的结构体
- - (NSPoint)pointValue;
- - (NSSize)sizeValue;
- - (NSRect)rectValue;
3.任意数据的包装
NSValue提供了下列方法来包装任意数据
- + (NSValue )valueWithBytes:(const void )value objCType:(const char *)type;
- value参数 : 所包装数据的地址
- type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成
从NSValue中取出所包装的数据
- - (void)getValue:(void *)value;
十六.NSDate
- 注意
- 如果是从NSString转换成NSDate,那么dateFormat的格式,必须和字符串中时间格式一致,否则会转换错误
1.NSDate基本概念
NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理
一个NSDate对象就代表一个时间
[NSDate date]返回的就是当前时间(零时区的时间)
NSDate *now = [NSDate date];
NSLog(@"now = %@", now);
// 设置转换后的目标日期时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];
// 得到源日期与世界标准时间的偏移量
NSInteger interval = [zone secondsFromGMTForDate: date];
NSLog(@"interval = %lu", interval);
// 在当前时间基础上追加时区差值
now = [now dateByAddingTimeInterval:interval];
NSLog(@"%@", date);
2.格式化日期
- NSDate -> NSString
// 1.创建时间
NSDate *now = [NSDate date];
// 2.创建时间格式化
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 3.指定格式
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 4.格式化时间
NSString *str = [formatter stringFromDate:now];
NSLog(@"%@", str);
- NSString -> NSDate
NSString *str = @"2015-06-28 19:53:24";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date = [formatter dateFromString:str];
NSLog(@"%@", date);
3.日期时间对象
- 结合NSCalendar和NSDate能做更多的日期\时间处理
注意
- 一般情况下,如果一个方法接收一个参数,这个参数是一个枚举,那么可以通过|符号,连接多个枚举值
获得NSCalendar对象
NSCalendar *calendar = [NSCalendar currentCalendar];
- 获得年月日
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
NSDate *date = [NSDate date];
// 1.创建日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 2.利用日历对象获取年月日时分秒
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *cmps =[calendar components:type fromDate:date];
NSLog(@"year = %lu", cmps.year);
NSLog(@"month = %lu", cmps.month);
NSLog(@"day = %lu", cmps.day);
NSLog(@"hour = %lu", cmps.hour);
NSLog(@"minute = %lu", cmps.minute);
NSLog(@"second = %lu", cmps.second);
NSLog(@"date = %@", date);
- 比较两个日期的差距
- - (NSDateComponents )components:(NSCalendarUnit)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
// 1.确定时间
NSString *time1 = @"2015-06-23 12:18:15";
NSString *time2 = @"2015-06-28 10:10:10";
// 2.将时间转换为date
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date1 = [formatter dateFromString:time1];
NSDate *date2 = [formatter dateFromString:time2];
// 3.创建日历
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
// 4.利用日历对象比较两个时间的差值
NSDateComponents *cmps = [calendar components:type fromDate:date1 toDate:date2 options:0];
// 5.输出结果
NSLog(@"两个时间相差%ld年%ld月%ld日%ld小时%ld分钟%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);
OC-基础数据类型的更多相关文章
- OC基础--数据类型与表达式
前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...
- OC基础数据类型-NSNumber
1.NSNumber:专门用来装基础类型的对象,把整型.单精度.双精度.字符型等基础类型存储为对象 //基本数据类型 //专门用来装基础类型的对象 NSNumber * intNumber = [[N ...
- OC基础数据类型-NSString
1.字符串的初始化 //字符串的初始化 NSString *str = @"Hello world!"; NSString *str2 = [[NSString alloc] in ...
- OC基础数据类型-NSData-NSMutableData-NSString
NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛.NSData创建后不可以再修改,NSMutableData可以再次修改. 1.NSStrin ...
- OC基础数据类型-NSSet
1.集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过NSArray是有序的集合,NSSet是无序的集合.集合是一种哈希表,运用散列算法,查找集合中的元素比数组 ...
- OC基础数据类型-NSData
1.NSData,数据,当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0.1字符流 1 NSString * str = @"hello, world! ...
- 【转】 OC基础数据类型-NSSet
原文 : http://www.cnblogs.com/GISerYang/p/3340937.html 1.集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过 ...
- OC基础数据类型-NSValue
1.NSValue:将指针等复杂的类型存储为对象 struct sct { int a; int b; }sctt; NSValue * value = [[NSValue alloc] initWi ...
- OC基础数据类型-NSDictionary
1.字典NSDictionary 字典与数组的区别:数组讲究顺序,而字典可以快速帮助我们找到数据,数据是我们的目的,键是我们的手段 NSDictionary *dict = [[NSDictionar ...
- OC基础数据类型-NSArray
1.数组的初始化 NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @&quo ...
随机推荐
- 腾讯发布 K8s 多集群管理开源项目 Clusternet
11月4日,在腾讯数字生态大会上,腾讯宣布了云原生领域一项重磅开源进展-- K8s 多集群管理项目 Clusternet 正式开源. Clusternet 由腾讯联合多点生活.QQ音乐.富途证券.微众 ...
- PTA 7-7 六度空间 (30分)
PTA 7-7 六度空间 (30分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:& ...
- RDD的详解、创建及其操作
RDD的详解 RDD:弹性分布式数据集,是Spark中最基本的数据抽象,用来表示分布式集合,支持分布式操作! RDD的创建 RDD中的数据可以来源于2个地方:本地集合或外部数据源 RDD操作 分类 转 ...
- HCNP Routing&Switching之BGP团体属性和团体属性过滤器
前文我们了解了BGP的路由过滤已经as-path过滤器的使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15542559.html:今天我们来聊一聊 ...
- Django笔记&教程 4-3 模型(models)主键外键
Django 自学笔记兼学习教程第4章第3节--模型(models)主键外键 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/ref/models ...
- 1组-Alpha冲刺-5/6
一.基本情况 队名:震震带着六菜鸟 组长博客:https://www.cnblogs.com/Klein-Wang/p/15564206.html 小组人数:7人 二.冲刺概况汇报 王业震 过去两天完 ...
- [loj3075]组合数求和
Subtask1:$m,nd\le 2\times 10^{3}$ 对$M$质因数分解,假设$M=\prod_{i=1}^{k}p_{i}^{\alpha_{i}}$(其中$p_{i}$为素数) ...
- [loj3176]景点划分
不妨设$a\le b\le c$,那么相当于要找到两个大小至少为$a$和$b$的连通块(连通块可以通过删除度最小的点变小) 以一个点为根建出dfs树并对以下情况分类讨论: 1.存在一个节点满足$\ma ...
- [bzoj1106]立方体大作战
先贪心,容易发现如果两个点中间没有点对,那么一定可以先把这两个点消掉分析一下,就可以发现这样两个点的答案就是这两个点对中间不成对的点数量扫描过去,线段树维护每一个点的权值(是否会被算入答案)即可 1 ...
- Collections集合工具类的常用方法
Collections集合工具类的方法 addAll与shuffle import java.util.ArrayList; import java.util.Collections; /* - ja ...