IPHONE 开发 9 -- Object C static关键字,数组对象,词典,动态词典,集合对象,函数调用关系
警告: static 写在interface外面编译是没有错误的,但是编译器会报警告,这么说这样的写法是不被编辑器认可的。
错误:static 写在interface里面会直接报错,显然这样的语法是不被认可的。
static关键字声明的变量必须放在implementation外面,或者方法中,如果不为它赋值默认为0,它只在程序开机初始化一次。
+(void)addCount 因为标识了+号,所以这个方法无需使用这个类的对象调用。直接使用类名方可调用这个方法。
使用数组对象创建的数组功能非常强大,在Java语言或者C语言中定义的数组必须满足数组中的每一个元素必须是同样的类型。而Objective-C语言可以在Array数组中放任意类型的数据,值得注意的是只能放指向这个对象的指针,如果直接放int ,char,double 等等,是不行的.
[array count] : 得到这个对象数组的长度。
[array objectAtIndex 0]: 传入数组脚标的id 得到数据对象。
[arrayWithObjects; ...] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil
词典类的存在就是为了解决在大量数据中查找方便,因为它是通过key直接找到value所以速度很快,避免一个个的遍历寻找造成的效率低下,善用字典类会帮你的程序提速
在Objective-C语言中词典对象就是做这个事情的,不过在同一个词典对象中可以保存多个不同类型的数据,不像Java与C 只能保存声明的相同类型的数据,它的关键字为NSDictionary与NSMutableDictionary。阅读过我之前文章的朋友应该从关键字的结构就可以看出这两个的区别。很明显前者为不可变词典,或者为可变词典。
1.创建不可变词典
[NSDictionary dictionaryWithObjectsAndKeys:..] : 使用键值对儿直接创建词典对象,结尾必需使用nil标志结束。
[NSDictionary initWithObjectsAndKeys:..] :使用键值对儿初始化词典对象,结尾必需使用nil标志结束。
[dictionary count]: 得到词典的长度单位。
[dictionary keyEnumerator]: 将词典的所有KEY储存在NSEnumerator中,NSEnumerator很像Java语言中的迭代器,使用快速枚举可以遍历词典中所有储存KEY值。
[dictionary objectEnumerator]: 将词典的所有value储存在NSEnumerator中,用法和上面差不多可用来遍历KEY对应储存的Value值。
[dictionary objectForKey:key]: 通过传入KEY对象可以拿到当前KEY对应储存的值。
- #import <UIKit/UIKit.h>
- #import "MyClass.h"
- int main(int argc, char *argv[])
- {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- //添加我们的测试代码
-
- NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"雨松MOMO",@"name",@"15810463139",@"number", nil];
-
- //得到词典的数量
- int count = [dictionary count];
- NSLog(@"词典的数量为: %d",count);
-
- //得到词典中所有KEY值
- NSEnumerator * enumeratorKey = [dictionary keyEnumerator];
-
- //快速枚举遍历所有KEY的值
- for (NSObject *object in enumeratorKey) {
- NSLog(@"遍历KEY的值: %@",object);
- }
-
- //得到词典中所有Value值
- NSEnumerator * enumeratorValue = [dictionary objectEnumerator];
-
- //快速枚举遍历所有Value的值
- for (NSObject *object in enumeratorValue) {
- NSLog(@"遍历Value的值: %@",object);
- }
-
- //通过KEY找到value
- NSObject *object = [dictionary objectForKey:@"name"];
-
- if (object != nil) {
- NSLog(@"通过KEY找到的value是: %@",object);
- }
-
-
-
- int retVal = UIApplicationMain(argc, argv, nil, nil);
- [pool release];
- return retVal;
- }
2.创建可变词典对象
NSMutableDictionary 是NSDictionary的子类,所以继承了NSDictionary的方法。
[NSMutableDictionary dictionaryWithCapacity:10] : 创建一个可变词典初始指定它的长度为10.,动态的添加数据如果超过10这个词典长度会自动增加,所以不用担心数组越界。
[NSMutableDictionary initWithCapacity:10] :只是初始化一个词典的长度为10。
[dictionary setObject: @"雨松MOMO" forKey: @"name"] :向可变的词典动态的添加数据,这里的key是name 值是雨松MOMO。如果词典中存在这个KEY的数据则直接替换这个KEY的值。
[dictionary removeAllObjects..] : 删除掉词典中的所有数据。
[dictionary removeObjectForKey..] :删除掉词典中指定KEY的数据。
集合对象
集合对象的关键字是NSSet与NSMutableSet。前者是不可变集合,后者是可变集合,Objective-C语言中大部分数据结构都存在可变与不可变两种数据。这里的集合很像Java语言与C语言中的Set,用法基本一样。但是在Objective-C语言中同一个集合可以储存不同对象的数据。下面分享一个例子就很清楚的看出。
1. 创建不可变集合对象
[NSNumber numberWithInteger:9527]; 因为集合中只能存放对象,所以如果要存数字的话要把数字转换成对象方可存入。
[NSSet setWithObjects:...]:创建集合对象,并且初始化集合中的数值,结尾必需使用nil标志。
[set count] ; 得到这个结合对象的长度。
[set containsObject:...]: 判断这个集合中是否存在传入的对象,返回Bool值。
[set objectEnumerator]: 将集合放入迭代器。
[enumerator nextObject]:得到迭代器中的下一个节点数据,使用while遍历这个迭代器,方可遍历集合对象中的对象。
[set isEqualToSet : objset]:判断两个集合是否完全相等,返回Bool值。
[set isSubsetOfSet: objset]:判断集合中的所有数据是否都相等与objeset集合中,返回Bool值。
[set istersectSet:objset]:判断集合中的至少有一个数据相等与objeset集合中,返回Bool值。
Objective-C的函数调用函数调用首先用 [ ] 来包住实现代码。函数调用的对象叫做接收器(receiver,可以理解为对象实例)。
用Interface Builder配置的控件Outlet就是接收器。接收器与函数(Objective-C中叫做消息)之间用空格分开。用[ ]括住的一个整体就是一次函数调用。
你也可以嵌套的使用这样的函数调用形式。比如从Text Field控件中取得输入值的时候,就是先在「motone」中执行了「text」,取出具体的文字对象,然后以其为接收器来执行「intValue」消息。这样,我们最终得到的结果就是一个整形的值。
计算与表示结果
接下来我们来计算打折后的价格。由商品原价「kakaku」和由Segmented Control控件得到的打折率需要计算出商品打折后的价格。比如选择最左边20%的时候,计算公式如下:
- kakaku = kakaku * (1.f - 0.2f);
小数后面的「f」表示「float」。如果将整数作为小数来使用的情况下,使用「1.f」而不是「1f」。不同的折扣率需要不同的计算方法,这里使用switch语法来区分各种情形: