美文网首页
30天学会ios开发"1.基本数据类型"

30天学会ios开发"1.基本数据类型"

作者: 沈悦 | 来源:发表于2019-07-09 16:59 被阅读0次
    数据也是一种美

    ios 基本数据类型分为以下几种,用好数据类型能让你一看就是个老手~
    1 NSString 字符串类型(还记得NS代表啥意思了吗?现在苹果已经在慢慢移除这个前缀啦)

    2 NSInteger 整形
    当使用int类型定义变量的时候,可以像写C程序一样,用int也可以用NSInteger,推荐使用NSInteger ,因为这样就不用考虑设备是32位还是64位了,NSInteger在64位取值范围是[2的-63次方]到[2的63次方减一]

    3 NSUInteger 无符号整形(即没有负数)

    4 NSArray 固定数组
    数组内可以塞入对象类型如 nsstring或者nsnumber,如果塞入int就会崩溃哦.一旦声明,不可再更改其内部的值.

    5 NSMutableArray 可变数组
    声明后可再更改其内部的值.

    6 NSDictionary 固定字典
    字典内可以塞入对象类型如 nsstring或者nsnumber,如果塞入int也会崩溃哦.

    7 NSMutableDictionary 可变字典
    声明后可再更改其内部的值.

    8 NSNumber 数字类,能形容一切的数字类型如cgfloat,int,long,float

    9 CGFloat 浮点型(能表示包含小数的数字类型)
    让我们先掌握以上几种数据类型吧

    10 bool 布尔类型 YES ,NO 代表是与不是

    数字类型介绍:

    写程序,最多接触的就是数字啦,掌握好数字类型让你事半功倍!
    首先ios 推荐使用nsinterger nsuinterger cgfloat 他们其实都是int unsigned int float 的包含在32位和64位下nsinterger 等oc类型表示的范围是有区别的,但是现在32位的ios设备已经被淘汰了,所以并没有区别了.
    数据类型的一个比较大的问题就是类型转换了

    CGFloat tFloat = 10/1000;
    

    得到的结果会是0 哦,surprise mother fxker!!!

    原因
    计算机中的运算有个原则:
    相同数据类型的值才能进行运算,而且运算结果依然是同一种数据类型。因此,整数除于整数,求出来的结果依然是整数,会损失小数部分。
    在计算中常常会忘记这个,所以做除法时务必记得这样!!!!!!!!

    CGFloat tFloat = (CGFloat)10/1000;
    

    NSNumber 作为oc 的数字类,方便大家继续数字相关的处理

    NSNumber *num = @(10); //oc 语法糖,快速转换int 为 nsnumber
    

    反之

    int myInt = [intNumber intValue]; //对象转换为整型值
          //[floatnumber floatValue]; //对象转换为浮点
          //[doublenumber doubleValue]; //对象转换为双精度浮点值
      
    

    nsnumber 最需要用到的地方就是将数字塞入nsarray 或者nsdictionary

    //这个是对的
    NSArray*array=[[NSArray alloc]init];
    [array addObject:[NSNumber numberWithInt:6]];
    
    //这个是错的
    NSArray*array=[[NSArray alloc]init];
    [array addObject:6];//程序会无法编译通过的
    

    此外数字处理最敏感的货币部分,可以使用NSDecimalNumber,其保留精度高,数字比较,四舍五入等方便计算.务必记得使用,同时可以定义数字的输出格式,这样在银行或科学方面app会有用;

    // 定义你数字的输出格式 输出为123,456.045 只保留小数点后三位
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = kCFNumberFormatterDecimalStyle;
    NSString *num = @"123456.0453";
    NSNumber *result111 = [NSNumber numberWithDouble:num.doubleValue];
    NSString *string = [formatter stringFromNumber:result111];
    

    附上数字与其他类型转换方式

    //字符串转int
    NSInteger lNumber = [sNumber integerValue]; 
    //int 转字符串
    NSString* sNumber = [NSString stringWithFormat:@"%ld", lNumber];
    //字符串转nsnumber
    NSNumber *myNumber = [f numberFromString:@"42"];
    //float 转 NSInteger
    NSInteger i = (NSInteger)1.345;
    

    字符串类型介绍:

    nsstring 字符串类型操作也十分丰富,本人在定义模型中基本上都用字符串类型,数字也使用字符串表示
    初始化化一个字符串的方法为

    //简单声明 "@"表示为oc nsstring类型字符串
    NSString *str = @"123";//NSString 为对象类型,所以记得加*号
    //将变量转换为字符串  
    NSString *string = [NSString stringWithFormat:@"%.2f",M_PI]; // %.2f表示保留小数点两位
    

    stringWithFormat 拼接时候的占位符一览
    %@ 对象 (非常常用)
    %d, %i 整数
    %u 无符整形
    %f 浮点/双字
    %x, %X 二进制整数
    %o 八进制整数
    %zu size_t
    %p 指针
    %e 浮点/双字 (科学计算)
    %g 浮点/双字
    %s C 字符串
    %.*s Pascal字符串
    %c 字符
    %C unichar
    %lld 64位长整数(long long)
    %llu 无符64位长整数
    %Lf 64位双字
    %e 是实数,用科学计数法计的

    此外字符串的常用方法其实很多很多

    
    //在字符串temp的基础继续添加temp 并组成一个新的字符串  
        NSString *str5 = [temp stringByAppendingString:temp];   
     //字符串以开头比较  
        if([str0 hasPrefix:@"just"])  
       //字符串以结尾比较  
        if([str1 hasSuffix:@"coding"])  
     //字符串完全相等比较  
        if([str0 isEqualToString:str1])   //注意不要使用==来比较,这样比较的是指针地址
    //写字符串到文件:writeToFile方法
    NSString *astring = [[NSString alloc] initWithString:@"This is a String!"];
    NSLog(@"astring:%@",astring);
    NSString *path = @"astring.text";    
    [astring writeToFile: path atomically: YES];
    

    字符串判断是否为空问题
    看似简单的nsstring 也有一个容易被坑的地方,那就是字符串判空.
    判断字符串为空:看似简单的问题,有人会说不就使用[string isEqualToString:@""]或者更简单的string.text == nil就行了嘛。但是并没有考虑到其中存在的一些问题,例如当字符串中存在空格或者换行时或者当请求后台数据时得到的是进行JSON解析的时候, 如果解析出的NSDictionary中某个key对应的value为空, 则系统会把它处理为NSNull类的单例对象。这些情况下,上面的判断方法就不会起到作用。

    +  (BOOL)isEmpty:(NSString *)aStr {
        if (!aStr) { //nil 当然为空
            return YES;
        }
        if ([aStr isKindOfClass:[NSNull class]]) { //nsnull 也为空
            return YES;
        }
        //剔除空格和换行符
        NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
        NSString *trimmedStr = [aStr stringByTrimmingCharactersInSet:set];
        if (!trimmedStr.length) {//长度为空
            return YES;
        }
        return NO;
    }
    

    json 问题
    处理字符串,自然少不了json字符串和nsarray,nsdictionary的转换,大家copy拿走吧

    //array,dictinary 转json串
    +(NSString *)objectToJson:(id)obj{
        if (obj == nil) {
            return nil;
        }
        NSError *error = nil;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:obj
                                                           options:0
                                                             error:&error];
        
        if ([jsonData length] && error == nil){
            return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        }else{
            return nil;
        }
    }
    
    //nsarray,nsdictionary转换为json字符串
    +(id)jsonToObject:(NSString *)json{
        //string转data
        NSData * jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
        //json解析
        id obj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];
        return obj;
    }
    

    小贴士: nsstring property在实践中经常使用copy,大家知道为什么吗?
    因为使用copy修饰之后,即使属性拷贝来自可变字符串,也会被深拷贝成不可变字符串,也就是源字符串修改之后不会影响到属性字符串,增强了代码的健壮性。

    //property nsstring 为copy 时
    age = 21;
    person.age = age; //age为copy
    age = 22;
    nslog(@"%d",person.age) //此时打印的是21,不收age的变化影响
    

    NSString 能表示字串符,但是对于表示字符串的格式就无能为力了,之后还会在富文本章节内介绍NSAttributedString.

    NSArray 数组类型介绍

    在工作中,我们经常要做feeds流,列表展示之类的页面.本质上,就是对数组的显示,所以掌握好数组真的非常重要,数组是用来储存oc对象的一种数据结构,好比一节节的火车车厢,每个车厢里坐着一个oc对象,大家按照顺序从头节坐到末节.(你想问这车厢具体有多少节呀,只要iphone内存够,这车厢就够长!)
    之前有说过数组分为NSArray和NSMutableArray,多使用不可变数组,效率更高.数组的重点在于查找与修改,灵活使用事半功倍,避免重复造轮子!

    不可变数组常用方法

    //新建一个数组
    NSArray *arr1 = @[@"11",@"22",@"33"]; //语法糖声明方法
    NSArray *arr2 = [[NSArray alloc] initWithObjects:@0, @1, @2, nil];//蠢乎乎的第二种声明方法,谁会用呢?
    //获取数组长度,为什么要用NSUInteger 你还记得吗? 其实用int NSInteger 也是可以的,不过浪费了变量空间的分配
    NSUInteger cout = [arr1 count];
    
    //获取某个位置的数组,请做好判断,避免访问到不存在的下标
     id obj = arr[2]; //程序都是从0开始表示第一位的,[2]表示第三个位置
     id obj = [arr1 objectAtIndex:2]; //同上一样的效果
    
    //判断某个对象是否存在
     BOOL result = [arr1 containsObject:@"11"]; 
    // /取得数组的首尾元素,很好用有没有,ios 早期版本还不支持lastObject这个方法,现在你处在一个好的时代.
        id obj = [arr1 lastObject]; //取得数组的最后一个元素
        id obj = [arr1 firstObject];// 取得数组的第一个元素
    
    // componentsSeparatedByString,以某个字符分割字符串,返回一个数组
        NSString *s = @"今天*我*休息";
        NSArray *arr2 = [s1 componentsSeparatedByString:@"*"];//返回@[@"今天",@"我",@"休息"]
        
    //将数组中元素用某个字符串拼接起来:componentsJoinedByString,返回一个字符串类型
        NSArray *arr = @[@"小米",@"华为",@"联想"].
        NSString *newString = [arr componentsJoinedByString:@"*"];//返回@"小米,华为,联想"
    

    可变数组常用方法

    //新建一个数组
    NSMutableArray<NSString*> *mArr = = @[@"11",@"22",@"33"].mutableCopy; //语法糖声明方法,声明一个带有初始元素的可变数组
    NSMutableArray<NSString*> *mArr = [[NSMutableArray alloc] init]; //常用方法
    

    注:<NSString*>表示数组内都为NSString类型, 不可变数组与可变数组都可以这样表示,在遍历或者调用内部元素的方法时ide能提示出对应方法~

    //添加元素
    [marr addObject:@"123"];
    
    //删除元素
    [mArr removeObject:@"123"];//当运用数组等的时候 运用removeObject移除对象的时候事实上这些集合内部是有一个判断的;这个判断是基于方法- (BOOL)isEqual:(id)object;的  而这个方法是判断内容是否相同。所以只要数组或者集合中有相同的元素,而你所要移除的对象正好在数组或者集合中有两个或者两个以上的时候,这些对象都将被移除!
    所以如果
    NSString *a = @"123";
    NSString *b = @"123";
    NSMutableArray *mArr =  @[@"1",@"2",a,b].mutableCopy;
    [mArr removeObject:b];
    a和b都会被移除,
    使用: 
    [mArr removeObjectIdenticalTo:a];//根据地址来移除元素
    a和b还是都会被移除
    因为 
    (lldb) p a
    (__NSCFConstantString *) $0 = 0x00000001027200c0 @"123"
    (lldb) p b
    (__NSCFConstantString *) $1 = 0x00000001027200c0 @"123"
    a 和 b只要字符串内容相同都指向同一个地址哟!!!!!!!!!!!!!
    所以只移除a 或者只移除 b 需要你的思考,怎么做到呢?????
    
    //改
    mArr[1] = @"456";  //数组的第二个元素改为456 ,
    [mArr setObject:@"456" atIndexedSubscript:1];//效果同上
    
    //遍历
    [mArr enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
          //obj 为当前遍历到的对象
          //idx 为遍历的位置 从0开始哦
          //stop 为是否有下一次循环  用 *stop = YES 来停止
     }];
    

    注意:
    跳出循环的坑:
    1 只用 *stop = YES; 表示没有下一次循环了,这次block"全部"执行完就结束了.
    2只用 return;表示这次block就到这,进入下一次循环.

    此外还有遍历数组的删除问题,边循环边删除会出现遍历跳过后一条的情况. 因为删除元素后,后面的元素下标会都减一,后面的元素跑到了你删除元素的位置,下一次遍历就跑到了下下个元素了. 有没有晕啊~哈哈

    //使用反向遍历来解决
    - (void)enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;
    
    

    字典类型介绍

    字典在很多语言里也叫map ,也有叫带键值对的数组.叫哈希表更高端一些,是根据key来设置和访问值的数据结构.很常用哦~

    //初始化
    NSDictionary *dic=@{@"name":@"aaa",@"age":@111};   
     
    //@"name" @"age" 表示key
    //@"aaa"  @111 表示为对应的值
    

    注: 字典里也是只能放对象类型 所以 放@111是可以的,111是不允许的.
    nil 也不被允许 如果你塞入的变量可能为nil 用name?:@""来替代
    ?: 为三元运算符
    NSString *str = (b==1?@"123":@"456") 表示 b等于1 的话 str 就赋值 @"123",否则赋值@"456"
    NSString *str = (b?:@"456")表示 b有值 的话 str 就赋值b,否则赋值@"456"

     //分别获取所有的键, 值
    
        NSLog(@"%@",dic.allKeys);
    
        NSLog(@"%@",dic.allValues);
    
        //获取字典键值对总数
    
        NSLog(@"%d",(dic.count));
    
        //字典遍历,快速枚举
    
        for (id key in dic) {
    
            id value=[dic objectForKey:key];
    
            NSLog(@"%@:%@",key,value);
    
        }
    
    

    for (id key in dic) 为一种快速遍历方法,适用于字典和数组,如果你只是想简单的把内容都取一遍,这个方法值得使用.

    NSMutableDictionary 可变字典介绍

    //创建一个nsmutabledictionary
        NSMutableDictionary *mutableDictionary=[NSMutableDictionary new];
        [mutableDictionary setObject:@"shenyue" forKey:@"name"];
        [mutableDictionary setObject:@21 forKey:@"age"];
        
        //得到词典中的所有key
        NSEnumerator *enumeratorkey=[mutableDictionary keyEnumerator];
        for (NSObject *obj in enumeratorkey) {
            NSLog(@"key为:%@",obj);
            NSLog(@"通过key找到value值为:%@",[mutableDictionary objectForKey:obj]);
        }
        
        //删除其中一个key
        [mutableDictionary removeObjectForKey:@"name"];
        NSLog(@"删除name的key以后值:%@",mutableDictionary);
        
        [mutableDictionary removeAllObjects];
        NSLog(@"删除所有以后,可变词典个数为%ld",[mutableDictionary count]);
        
    

    以上为数据类型的简单介绍,工作中最多碰到的就是这些,后面还会深入介绍其他类型.

    相关文章

      网友评论

          本文标题:30天学会ios开发"1.基本数据类型"

          本文链接:https://www.haomeiwen.com/subject/xpcfkctx.html