1 //
2 // main.m
3 // 集合类
4 //
5 // Created by sixleaves on 15/5/14.
6 // Copyright (c) 2015年 小码哥. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10
11
12 void createSet();
13 void createArray();
14 void createDictionary();
15 int main(int argc, const char * argv[]) {
16
17 createSet();
18 createArray();
19 createDictionary();
20
21 return 0;
22 }
23
24
25 void createArray() {
26 // C语言数组与NSArray的区别
27 /*
28 1.NSArray可以存放任何对象,而C语言只能存放一种类型。
29 2.NSArray不能存放基本数据类型,而C语言数组可以。
30 3.NSArray不能存放空值(nil).
31 */
32
33 // 不可变数组,创建后不可再改变,所以array永远是空数组
34 // 所以不可变数组,只能在创建的时候放数据进去。
35 NSArray *array = [NSArray array];
36
37 // 0.nil用来标识NSArray中结束的标识
38 // 0.古老方式-创建数组
39 NSArray *array2 = [NSArray arrayWithObjects:@"jack", @"swp", nil];
40
41 // 0.常用方式-创建数组(编译器特性)
42 NSArray *array3 = @[@"swp", @"gh"];
43
44 // 1.数组元素的个数
45 long len = array2.count; // 点语法
46 NSLog(@"%ld", len);
47
48 // 2.访问数组
49 // 古老的方式
50 NSLog(@"%@", [array2 objectAtIndex: 1]); // 从0开始计数
51
52 // 常用方式(编译器特性)
53 NSLog(@"%@", array2[1]);
54
55 // 3.数组遍历方式
56 // 3.1-古老方式
57 NSArray * array5 = @[@"fuck", @"what", @"you"];
58 for ( int i = 0; i < array5.count; i++) {
59 NSLog(@"%@", array5[i]); // NSArray中的元素都是对象
60 // 而对象打印出都是用%@
61 }
62
63 // 3.1-常用方式
64 for (id obj in array5) {
65 NSLog(@"%@", obj);
66 }
67
68 // 3.1-常用方式-block
69 [array5 enumerateObjectsUsingBlock:
70 ^(id obj, NSUInteger idx, BOOL *stop) {
71 NSLog(@"%ld-%@",idx, obj);
72 *stop = YES;
73 }
74 ]; // 每拿到一个元素都会回调block,obj就是元素,idx为元素的对应索引
75 // stop是用来表示是否继续下一次循环。如果设置成YES本次循环结束
76 // 就不会继续下一次。
77 /*
78 NSArray总结:
79 1.创建方式(常用-古老)
80
81 2.访问方式(常用-古老)
82
83 3.遍历方式(三种)
84 3.1 直接for循环
85 3.2 for-in循环
86 3.3 使用block
87 */
88
89
90 // 1-1.创建. 创建不可变数组只能通过方法创建。(@[]创建的不可变数组)
91 NSMutableArray *array7 = [NSMutableArray array]; // arrayWithObjects
92
93 // 2-1 添加
94 [array7 addObject:@"swp"];
95
96 // 3-1 删除
97 [array7 removeObject:@"swp"];
98 // [array removeObjectAtIndex:0];
99 // [array removeAllObject];
100
101 // 遍历
102 for (id obj in array7) {
103
104 NSLog(@"%@", obj);
105 }
106
107
108 }
109
110 void createSet() {
111 /*
112 NSSet与NSArray最大的区别就是NSSet是无序的。
113 */
114 NSSet *s = [NSSet setWithObjects:@"swp", @"fuck", nil];
115
116 NSLog(@"len = %ld", s.count);
117
118 /*
119 因为set是无序的,所以从set中取东西逻辑上就不可能有序,也就是随机的。
120 */
121 NSString *str = [s anyObject];
122
123 NSLog(@"str = %@", s);
124
125 // 创建
126 NSMutableSet *s2 = [NSMutableSet set];
127
128 // 添加
129 [s2 addObject:@"fuck"];
130
131 // 遍历
132 for (id obj in s2) {
133 NSLog(@"obj in set is = %@", obj);
134 }
135
136 // NSSet不能使用block进行遍历
137
138 // 删除
139 [s2 removeObject:@"fuck"];
140
141
142
143 /*
144 NSSet与NSArray的对比
145 1》共同点
146 * 都是集合、能存放多个OC对象。
147 * 都不能存放基本数据类型、结构体、枚举、共用体
148 * 本身都是不可变的、都有一个可变的子类。
149
150 2》不同点
151 1.NSSet是无序的,NSArray是有序的。
152
153 */
154 }
155
156 void createDictionary() {
157 /*
158 NSDictionary: 表示的是一种映射关系,是不可变对象。
159 NSMutableDictionary: 可变对象。
160 字典也是没有顺序的。
161 */
162 // 1-1.创建的是空字典、
163 NSDictionary * dict1 =[NSDictionary dictionary];
164
165 // 1-2.根据值数组和键数组创建字典。
166 NSArray *keys = @[@"name", @"address"];
167 NSArray *values = @[@"jack", @"北京"];
168
169 NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:values forKeys:keys];
170 //NSLog(@"dict2 = %@", dict2);
171
172 // 1-3.直接根据键值对创建
173 NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
174 @"jack", @"name",
175 @"北京", @"address",
176 @"10086", @"qq", nil];
177 // 1-3.常用方式-编译器特性.
178 NSDictionary *dict4 = @{@"name": @"jack", @"address" : @"北京"};
179
180 // 2-1.旧方式-访问字典
181 id obj = [dict4 objectForKey:@"name"];
182
183 // 2-1.新方式-访问字典
184 id obj1 = dict4[@"name"];
185 // NSLog(@"%@, %@", obj, obj1);
186
187
188 // 3-1.字典键值对的大小
189 NSUInteger i = dict4.count;
190 NSLog(@"i = %ld", i);
191
192
193
194 // NSMutableDictionary
195
196 NSMutableDictionary * dict5 = [NSMutableDictionary dictionary];
197
198 // 1.添加
199 [dict5 setObject:@"jack" forKey:@"name"];
200
201 [dict5 setObject:@"rose" forKey:@"name"]; // 会覆盖掉原来的值
202
203 // 2.删除(键值对)
204
205 // [dict5 removeObjectForKey: @"name"];
206
207 // 3.打印字典, 直接NSLog就行。
208
209 // 4.注意点
210 /*
211 @{}创建的不可变字典,不能将其赋值给可变字典指针!否则可能在程序
212 运行过程中会引起程序崩溃!因为调用了可变字典的方法。
213 */
214
215 }
216
总结:以后一看到Mutable就知道这两个肯定是父子关系。
NSArray\NSMutableArray:
*有序
*快速创建方式:(不可变) @[]
*快速访问方式: 数组名[i]
NSSet\NSMutableSet:
*无序
*无快速创建方、和快速访问方式
NSDictionary\NSMutableDictionary:
*无序
*快速创建方式(不可变): @{}
*快速访问方式: 字典名[键值]