三大特性与数据类型

    //引用Foundation框架
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
//程序入口:返回类型 main(相关的参数){
    //函数体

    //return 返回类型参数;
//}
int main(int argc, const char * argv[]) {
    
    //NSLog 为输出语法
    NSLog(@" Hello, DA Xiong " );
    
    //引入头文件#import "Person.h"
    //实例化Person对象newPerson
    Person *newPerson=[[Person alloc]init];
//    设置对象age属性的值
    [newPerson setAge:1000];
//    获取newPerson对象age的值,利用对象方法getAge,这个方法因为有返回值能够直接打印或者用一个相应类型的变量的接受
    int age=[newPerson getAge];
    NSLog(@"person age:%i",age);
    //类方法调用对象方法
    [Person print];
    
    //---------复习-------
//    实例化对象的步骤:
//    1.建立一个类 2.引入头文件 #import “头文件” 3.实例化对象 类 *对象名=[[类名 alloc]init];
    
//    关于方法
//    方法书写:
//    方法类型 (返回值类型)方法名 :(参数类型)参数名
//    类方法:  +
//    对象方法: —
//    类方法不可使用类属性
    
    //------关于继承
    //子类继承父类以后可使用父类的属性和方法
    Student *student=[[Student alloc]init];
    [student setAge:20];
    NSLog(@"student age :%i",[student getAge]);
    [student method];
    
//    子类继承父类,子类可使用父类的属性和方法,但父类不能使用子类独有的方法[newPerson method];
    
    
    Person *person=[[Student alloc]init];
    [person setAge:28];
    NSLog(@"person age:%i",[person getAge]);
    
    //多态形式,父类参数能够传入子类对象
    [person printf:student];
     //建立一个不可变的字符串
    NSString *testString = @"jack";
    
    //建立一个实例化后的对象
    NSMutableString *testMuString = [[NSMutableString alloc]init];
    NSMutableString *testMuStringI = [NSMutableString new];
    //建立一个实例化后的对象并给必定变量一个初始的内存空间
    NSMutableString *testMuStringII = [[NSMutableString alloc]initWithCapacity:10];
    //建立一个对象,注意:调用的是类方法建立
    NSMutableString *testMuStringIII = [NSMutableString string];
    //给一个可变的字符串追加一个字符串 append
    [testMuString appendString:@"123"];
    NSLog(@"testMuString append String is: %@", testMuString);
    //给一个可变的字符串修改一个字符串 stringReplacing
    NSString *replaceString = [testMuString stringByReplacingOccurrencesOfString:@"123" withString:@"456"];
    NSLog(@"testMuString replacing String is: %@", replaceString);
    
    //给一个可变的字符串删除一个字符串
    [testMuString deleteCharactersInRange:NSMakeRange( 1,2 )];
    NSLog(@"testMuString delete String is: %@", testMuString);
    
    //NSArray
    //数组的特色: 有序,类型相同
    //定义一个不可变的数组
    NSArray *testArray = @[ @"1" , @"2", @"3" ];
    //打印数组,取出下标
    NSLog(@"testArray is %@, 下标为0的数为:%@", testArray, testArray[0] );
    //建立一个可变的数组
    NSMutableArray *testMuArray = [[NSMutableArray alloc]init];
    //建立一个可变的数组,给予一个初始的内存空间
    NSMutableArray *testMuArrayI = [[NSMutableArray alloc]initWithCapacity:10];
    
    //给数组追加一个元素  add
    [testMuArrayI addObject:@"4"];
    NSLog(@"testMuArrayI addObject is : %@", testMuArrayI );
    
    //修改一个数组下标元素的值
    testMuArrayI[0] = @"1";
    [testMuArrayI setObject:@"2" atIndexedSubscript:0];
    NSLog(@"testMuArrayI modify is : %@", testMuArrayI );
    
    //删除一个数组里面的元素
    [testMuArrayI removeObject:@"2"];
    
    //删除数组的所有元素
    [testMuArrayI removeAllObjects];
    
    NSLog(@"testMuArrayI remove is: %@", testMuArrayI);
    
    //NSDictionary 字典
    //字典一般是以键值对的形式存在,key-value,例如 “name” : "jack" , name为key,value为jack
    //记住:数组是有序的,字典是无序
    //注意:不可变的家庭里 NSString @"",NSArray @[], NSDictionary @{}
    NSDictionary *testDict = @{
            @"name" : @"jack", //键值对之间以逗号,分割
            @"age" : @"17" //键值对
    };
    NSLog(@"testDict: %@", testDict );
    //建立一个可变的字典
    NSMutableDictionary *testMuDict = [[NSMutableDictionary alloc]init];
    //追加一对键值对
    [testMuDict addEntriesFromDictionary: @{ @"mother" : @"rose" }];
    //修改一对键值对
    testMuDict[@"name"] = @"daXiong";
    //若是不存在添加一对键值对,若是存在修改这个键值对
    [testMuDict setValue:@"daDaXiong" forKey:@"name"];
    [testMuDict setValue:@"daDaXiong" forKey:@"nick"];
    NSLog(@"testMuDict: %@", testMuDict );
    //删除一对键值对
    [testMuDict removeObjectForKey:@"nick"];
    //删除所有键值对
    [testMuDict removeAllObjects];
    NSLog(@"testMuDict: %@", testMuDict );
    
    //NSNumber:一般为封装基本的数据类型,注意:NSNumber封装后通常类型为对象类型 例如 @1 为对象类型
    //基本的数据类型:int float char double bool
    NSNumber *number1 = @1;
    NSNumber *number2 = @1.1f;
    NSNumber *number3 = @'c'; //注意打印出来C是ASCII
    NSNumber *number4 = @YES;
    
    NSLog(@"number1 is %@ , number2 is %@ ,number3 is %@, number4 is %@", number1, number2, number3, number4 );
    
    //一、遍历一个字典
//    for (int i=0; i<[testDict count]; i++) {
//        NSLog(@"%@",);
//    }
    //遍历字典是能够遍历字典的键经过for 的方式:for ( 变量名 in 字典)。变量名能够是任何,可是得到的是键
    
    
    for (id key in testDict) {
        NSLog(@"dict :%@",key);
        NSLog(@"value :%@",[testDict valueForKey:key]);
        
    }
//    或者咱们经过获取字典的全部键或全部值的方法,得到的数组遍历获得所需内容
    NSLog(@"字典的全部值:%@",[testDict allValues]);//返回NSArray,是得到字典全部值
    //在值的数组里遍历
    for (id key in [testDict allValues] ) {
        NSLog(@"dict :%@",key);
        //        NSLog(@"value :%@",[testDict valueForKey:key]);
        
    }
    
    
    //二、遍历一个数组
    for (int i=0;i<[testArray count];i++){
        NSLog(@"数组遍历元素:%@",testArray[i]);
   
    }
    
    for (NSString *object in testArray) {
         NSLog(@"数组遍历元素:%@",object);
    }

//--------------    结构体    ----------------
    
    //-----NSRange----描述范围:参数为,位置和长度
    NSRange range=NSMakeRange(2, 3);
    NSLog(@"range location:%li, length:%li",range.location ,range.length);
    
    //------NSPoint-----描述位置
    NSPoint point =NSMakePoint(1, 3);
    NSLog(@"point x:%.2f y:%.2f",point.x,point.y);
    
    //----NSSize-----描述大小(宽高)
    NSSize size=NSMakeSize(34, 88);
    NSLog(@"size weight :%.2f height:%.2f ",size.width,size.height);
    
    //------NSRect-----描述位置和大小
    NSRect rect =NSMakeRect(2, 3, 67.3, 23.2);
    NSLog(@"%.2f %.2f %.2f %.2f",rect.origin.x,rect.origin.y ,rect.size.width, rect.size.height);
    
    NSLog(@"",rect);
    
    //-------NSValue 用来封装结构体,是NSNumber的父类------
    //封装NSRect
    NSValue *rectValue=[NSValue valueWithRect:rect];
    NSLog(@"Value Rect:%@",rectValue);

//    封装NSPoint
    NSValue *pointValue=[NSValue valueWithPoint:point];
   
    
    NSArray *arrayWithStruct=@[rectValue,pointValue];
    
    for (int i=0; i<[arrayWithStruct count]; i++) {
        NSLog(@"%@",arrayWithStruct[i]);
        
        NSValue *pointV=arrayWithStruct[1];
        //NSValue 能够转化为响应的结构体类型

        NSPoint po=[pointV pointValue];
        NSRect re=[rectValue rectValue];
        NSLog(@"%.2f",re.size.width);
    }
    
    //经过枚举的方式得到字典的值
    //---------按值枚举
    //像字典请求一个枚举器
    NSEnumerator *enumI=[testDict objectEnumerator];
//    定义接受下一个枚举元素的变量
    NSString *object;
//    经过循环逐一获取枚举元素
    while (object = [enumI nextObject] ) {
        NSLog(@"======%@",object);
    }
    
//  -------------  按键枚举
    //向字典请求一个枚举器
    NSEnumerator *enumII=[testDict keyEnumerator];
    //    定义接受下一个枚举元素的变量
    NSString *objectII;
    //    经过循环逐一获取枚举元素
    while (objectII = [enumII nextObject] ) {
        NSLog(@"======%@",objectII);
    }
    
    //经过枚举的方式得到数组的值
//    向数组请求一个枚举器
    NSEnumerator *enumIII=[testArray objectEnumerator];
    //    定义接受下一个枚举元素的变量
    NSString *objectIII;
    //    经过循环逐一获取枚举元素
    while (objectIII = [enumIII nextObject] ) {
        NSLog(@"======%@",objectIII);
    }