文档章节

字典,拆装箱

Heisenbean
 Heisenbean
发布于 2014/09/20 15:15
字数 1299
阅读 47
收藏 0

字典/Dictionary                                                                                

这里的key就相当于字典里的索引

value相当于文字内容,一个key对应一个value

Dictionary中储存的是键值对,就是key--value

{
//    定义字典的方法1    
//    NSDictionary *dic = [NSDictionary dictionaryWithObject:@"tom" forKey:@"name"];
//    id obj = [dic objectForKey:@"name"];
//    这里查到name就可以访问到tom
//    NSLog(@"%@",obj);

//    定义字典的方法2(常用方法)
    NSDictionary *dict = @{@"Name": @"Aaron Paul",@"Age": @"23"};
    id obj = dict[@"Name"];
    NSLog(@"%@",obj);

// 利用count可以获取当前字典中的键值对个数
    NSUInteger dicCount = [dict count];
    NSLog(@"%ld",dicCount);
  //NSLog(@"%ld",dict.count);  这是常见方法 
	return 0;
}


NSMutableDictionary

NSMutableDictionary是NSDictionary的子类,是可变的字典,所以当用它初始化完一个字典后,还可以往里添加和删除键值对

void test()
{
    // 初始化一个空的可变字典
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    // 添加键值对
    [dict setObject:@"Phil" forKey:@"Name"];
    // 如果在相同的key里添加已有的value,则这个value会覆盖,不会多出一个键值对
    [dict setObject:@"Lee" forKey:@"Name"];
    //删除某个key所指向的键值对
    [dict removeObjectForKey:@"address"];
}

NSDictionary遍历

#import <Foundation/Foundation.h>

int main()
{
    // 遍历方法1:传统遍历方法
    NSDictionary *dic = @{@"Name": @"hdb", // 注意这里的key必须是唯一的,但是value可以有多个
                          @"Age": @"23", // @"Name1": @"hdb"
                          @"QQNumber": @"5690316"};
//    NSArray *keys = [dic allKeys];
//    NSLog(@"%@",keys);
//    for (int i= 0; i < dic.count; i++) {
//        // 取出key
//        NSString *key =  keys[i];
//        // 取出key对应的值
//        NSString *obj = dic[key];
//        NSLog(@"%@--%@",key,obj);
//    }
    
    
    // 遍历方法2:Xcode提供的方法遍历
    // 利用block遍历,建议使用这个
    [dic enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@--%@",key,obj);
//         *stop = YES; 打印完一次就停止
    }];
    return 0;
}

装箱和拆箱                                                                                              

从上面的例子中我们也可以看到,数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的(也就是说有些NSObject的方法是无法调用的),这个时候通常会用到装箱(boxing)和拆箱(unboxing)。其实各种高级语言基本上都有装箱和拆箱的过程,例如C#中我们将基本数据类型转化为Object就是一个装箱的过程,将这个Object对象转换为基本数据类型的过程就是拆箱,而且在C#中装箱的过程可以自动完成,基本数据类型可以直接赋值给Object对象。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。

NSNumber

在ObjC中我们一般将基本数据类型装箱成NSNumber类型(当然它也是NSObject的子类,但是NSNumber不能对结构体装箱),调用其对应的方法进行转换:

+(NSNumber *)numberWithChar:(char)value;

+(NSNumber *)numberWithInt:(int)value;

+(NSNumber *)numberWithFloat:(float)value;

+(NSNumber *)numberWithDouble:(double)value;

+(NSNumber *)numberWithBool:(BOOL)value;

+(NSNumber *)numberWithInteger:(NSInteger)value;

拆箱的过程就更加简单了,可以调用如下方法:

-(char)charValue;

-(int)intValue;

-(float)floatValue;

-(double)doubleValue;

-(BOOL)boolValue;


sample code:

#import <Foundation/Foundation.h>

int main()
{
    // NSNumber的使用
    // 传统方法是把基本数据类型封装成NSNumber放入字典中
    NSNumber *num1 = [NSNumber numberWithInt:100];
    NSDictionary *dict = @{@"name": @"hdb",
    @"age": num1
    };
    
    NSNumber *num2 = dict [@"age"];
    // 把NSNumber转成整型类型
    int num3 = [num2 intValue];
    NSLog(@"%d",num3);
    
    //但是常用的是@后面直接跟一个基本数据类型
    NSArray *array =@[
    @{@"name" :@"hdb",@"age" :@23}
    ];
    // 包装已经定义好的基本数据类型
    int n = 10;
    @(n);   //这里要先把n括起来取值,然后再用@包装
    
    // 字符串与基本类型之间的转换
    NSString *str = [NSString stringWithFormat:@"200"];
   int num4 = [str intValue];
    NSLog(@"%d",num4);
    
	return 0;
}

NSValue

NSValue的功能和NSNumber一样,但却比它功能强大的多,它可以包装任何类型,比如基本数据类型,结构体等

NSValue的拆箱和装箱方法如下

事实上对于常用的结构体Foundation已经为我们提供好了具体的装箱方法:

+(NSValue *)valueWithPoint:(NSPoint)point;

+(NSValue *)valueWithSize:(NSSize)size;

+(NSValue *)valueWithRect:(NSRect)rect;

对应的拆箱方法:

-(NSPoint)pointValue;

-(NSSize)sizeValue;

-(NSRect)rectValue;


sample code:

int main()
{
    // 比如包装Range结构体
        //1.定义一个range结构体
    NSRange range = NSMakeRange(10, 100);
        //2.把range转成NSValue类型
    NSValue *valueRange = [NSValue valueWithRange:range];
        //3.就可以放入到OC数组
    NSArray *array = @[valueRange];
    // 同样其他的结构体也是这样的方法包装
	return 0;
}

注:NSNumber是NSValue的子类

日期                                                                                                    

Foundation框架中日期的操作

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
    
    NSDate *date1=[NSDate date];//获得当前日期    
    NSLog(@"%@",date1); //结果:2014-07-16 07:25:28 +0000    
    NSDate *date2=[NSDate dateWithTimeIntervalSinceNow:100];//在当前日期的基础上加上100秒,注意在ObjC中多数时间单位都是秒    
    NSLog(@"%@",date2); //结果:2014-07-16 07:27:08 +0000    
    NSDate *date3=[NSDate distantFuture];//随机获取一个将来的日期    
    NSLog(@"%@",date3); //结果:4001-01-01 00:00:00 +0000    
    NSTimeInterval time=[date2 timeIntervalSinceDate:date1];//日期之差,返回单位为秒    
    NSLog(@"%f",time); //结果:100.008833    
    NSDate *date5=[date1 earlierDate:date3];//返回比较早的日期    
    NSLog(@"%@",date5); //结果:2014-07-16 07:25:28 +0000
    
    //日期格式化    
    NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
    formater1.dateFormat=@"yy-MM-dd HH:mm:ss";
    NSString *datestr1=[formater1 stringFromDate:date1];
    NSLog(@"%@",datestr1); //结果:14-07-16 15:25:28
    
    //字符串转化为日期    
    NSDate *date6=[formater1 dateFromString:@"14-02-14 11:07:16"];
    NSLog(@"%@",date6); //结果:2014-02-14 03:07:16 +0000    return 0;
}


© 著作权归作者所有

Heisenbean
粉丝 0
博文 16
码字总数 20720
作品 0
漯河
高级程序员
私信 提问
jdk5.0新特性—— 自动拆装箱

目录 1、自动拆装箱 2、练习:向下兼容 3、记住:八种基本的数据类型对应的包装类 ============================================================= 1、自动拆装箱 装箱:把基本的数据类型转...

Eric-Zhou
03/04
0
0
黑马程序员--JDK1.5新特性(一)

--------------------android培训、java培训、期待与您交流!-------------------- 1.可变参数 可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后...

长平狐
2013/07/01
61
0
密码保护:一文读懂什么是Java中的自动拆装箱

这是一篇受密码保护的文章,您需要提供访问密码: 密码: 【公告】版权声明(全文完)欢迎关注HollisChuang微信公众账号 如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuan...

2018/09/01
0
0
Java 自动拆箱和自动装箱学习笔记

Java 自动拆箱和自动装箱学习笔记 详情参考以下 深入剖析Java中的装箱和拆箱 JDK自动拆箱下,三目运算符的潜规则 Java 自动装箱与拆箱的实现原理 Autoboxing and Unboxing 1. 概述 Java 中的...

等到烟火清凉_
2018/08/25
52
0
Java常见面试题及答案1-10

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 Java 被设...

t4i2b10x4c22nf6a
2017/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zk中ToBeAppliedRequestProcessor解析

ToBeAppliedRequestProcessor在Leader中 在已处理事务和最后处理事务处理器之间,处理器链上下一个是FinalRequestProcessor public void processRequest(Request request) throws RequestPro...

writeademo
14分钟前
2
0
Allegro快捷键设置-PCB环境

立题简介: 内容:简单介绍Allegro绘制的PCB环境下的快捷键; 来源:实际使用得出; 作用:对Allegro绘制PCB快捷键进行介绍; PCB环境:Cadence 16.6; 立题详解: 对“allegro”板而言,其在...

demyar
15分钟前
2
0
idea maven web项目启动build时报错java.lang.NullPointerException

之前还好好的,重启一下idea就报这个错了,大概率是tomcat没杀掉端口被占用了,在tomcat配置中更换一下sever端口就好了

宇辰OSC
19分钟前
2
0
weed3-2.3.1.查询之输出

Weed3 一个超轻量级ORM框架(只有0.1Mb哦) 源码:https://github.com/noear/weed3 源码:https://gitee.com/noear/weed3 查询可是个复杂的话题了,可能我们80%的数据库处理都在查询。 今天先...

刘之西东
19分钟前
2
0
【Android JetPack系列】数据绑定:DataBinding

参考MVVM

Agnes2017
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部