Objective-C_NSString、NSArray、NSNumber

Foundation框架

Foundation框架是Cocoa编程、iOS编程的基础框架,包括:字符串、集合、日期、时间等基础类。

一、NSString和NSMutableString的使⽤

C语⾔,字符串是由char(ASCII码)字符组成。

Objective-C,字符串是由unichar(Unicode)字符组成。

NSString:不可变字符串,继承NSObject;即创建之后,内容和长度不能更改,其字符串截取、拼接等常用方法返回值类型为(NSString *),本质是得到一个新的字符串。

NSMutableString:可变字符串,继承NSString;即创建之后,修改的是字符串本身,其字符串插入、替代等常用方法返回值类型为(void)。

创建一个字符串,可以使用实例⽅法(init方法)或便利构造器。

NSString和NSMutableString的使用与讲解,请阅读以下代码:

#pragma mark - 字符串类
#if 0 /* OC 字符串由 Unichar(Unicode) 字符组成 */
        NSLog(@"unichar: %lu", sizeof(unichar));
#endif

#pragma mark ** 不可变字符串
#if 0 /* 1.创建字符串 */
//        NSString *string = [[NSString alloc] initWithString:@"Hello, World!"];

        /* 最常用的方法 */
        /* 字面量形式创建字符串 */
        NSString *string2 = @"Hello!";

        /* 初始化方法创建字符串 */
        NSString *string3 = [[NSString alloc] initWithString:string2];

        /* 便利构造器创建字符串 */
        NSString *string4 = [NSString stringWithString:string2];

        NSLog(@"%@", string4);

        /* format */
        NSString *string5 = [NSString stringWithFormat:@"str:%@", string4];
        NSLog(@"%@", string5);

        NSString *name = @"ZhangSan";
        NSString *age = @"18";
        /* 创建一个新字符串 */
        NSString *person = [NSString stringWithFormat:@"我叫%@, 今年%@", name, age];
        NSLog(@"%@", person);

        /* 2. 获取字符串长度 */
        NSString *str = @"0123";
        NSLog(@"length: %lu", [str length]);
        NSLog(@"len: %lu", str.length);
#endif
#if 0 /* 3. 获取子字符串 */
        NSString *str = @"用户名: Tom, 密码: abc";

        /* 取"abc" */
        NSString *subStr = [str substringFromIndex:14];
        NSLog(@"%@", subStr);

        /* 取"用户名" */
        NSString *subStr1 = [str substringToIndex:3];
        NSLog(@"%@", subStr1);

        /* 取"Tom" */
        NSRange rang = NSMakeRange(5, 3);
        NSString *tom = [str substringWithRange:rang];
        NSLog(@"%@", tom);
#endif
#if 0 /* 4. 拼接字符串 append */
        NSString *province = @"吉林省";
        NSString *city = @"四平市";
        NSString *area = @"铁西区";

        NSString *locol = [province stringByAppendingString:city];
        NSString *locol2 = [[province stringByAppendingString:city] stringByAppendingString:area];
        NSLog(@"%@", locol2);

        NSString *locol3 = [province stringByAppendingFormat:@"%@%@", city, area];
        NSLog(@"%@", locol3);
#endif
#if 0 /* 替换字符串 replac */
        NSString *word = @"helle";
        NSString *newWord = [word stringByReplacingOccurrencesOfString:@"helle" withString:@"hello"];
        NSLog(@"%@", newWord);

        NSString *word1 = [word stringByReplacingCharactersInRange:NSMakeRange(4, 1) withString:@"o"];
        NSLog(@"%@", word1);
#endif
#if 0 /* 字符串相等 eq */
        NSString *userName = @"ZhangSan";
        if ([userName isEqualToString:@"ZhangSan"]) {
            NSLog(@"该账户存在");
        }
        else {
            NSLog(@"该账户不存在");
        }
#endif
#if 0 /* 字符串比较 comp */
        NSString *str1 = @"Hello";
        NSString *str2 = @"Hey";
        NSLog(@"%ld", [str1 compare:str2]);
#endif
#if 0 /* 示例: 给定一个图片文件名,判断字符串中是否以“png”结尾,如果是就替换成“jpg”,如果不是,就拼接”.jpg”。 */
        NSString *image = @"haha.png";

        if ([[image substringFromIndex:image.length - 3] isEqualToString:@"png"]) {
            image = [image stringByReplacingCharactersInRange:NSMakeRange(image.length - 3, 3) withString:@"jpg"];
        }
        else {
            image = [image stringByAppendingString:@"jpg"];
        }
        NSLog(@"%@", image);
#endif
#if 0 /* 判断字符串已指定的字符串开头或者结尾 prefix */
        NSString *image = @"haha.png";
        if ([image hasSuffix:@"png"]) {
            image = [image stringByReplacingOccurrencesOfString:@"png" withString:@"jpg"];
        }
        else {
            image = [image stringByAppendingString:@"jpg"];
        }
        NSLog(@"%@", image);
#endif

#pragma mark ** 可变字符串
#if 0 /* 1. 创建可变字符串 */
        NSMutableString *mStr = [NSMutableString stringWithFormat:@"abcdef"];
        NSLog(@"%@", mStr);

        /* 2. 拼接字符串 */
        [mStr appendString:@"是可拼接的"];
        NSLog(@"%@", mStr);

        /* 3. 插入字符串
         * abcdef是可拼接的字符串
         */
        [mStr insertString:@"字符串" atIndex:mStr.length];
        NSLog(@"%@", mStr);

        /* 4. 删除字符串 
         * 删除"字符串"
         */
        [mStr deleteCharactersInRange:NSMakeRange(mStr.length - 3, 3)];
        NSLog(@"%@", mStr);
#endif
#if 0 /* 字符串与数值类型转换 value */
        NSString *str = @"100";
        int a = str.intValue;
        NSLog(@"a: %d", a);

        NSString *aStr = [NSString stringWithFormat:@"%d", a];
        NSLog(@"aStr: %@", aStr);
#endif
#if 0 /* 字符串大小写转换 case */
        NSString *str = @"I have an iPhone";
        /* 小写 */
        NSLog(@"%@", [str lowercaseString]);
        /* 大写 */
        NSLog(@"%@", [str uppercaseString]);

        /* 首字母大写 */
        NSLog(@"%@", [str capitalizedString]);
#endif

二、NSArray和NSMutableArray的使用

iOS中存放数据的容器类都称为集合(collection)。数组是有序集合,只能存放对象。数组通过下标取元素,且下标从0开始。数组与字符串类一样也分为不可变数组(NSArray)和可变数组(NSMutableArray)。

NSArray和NSMutableArray的使用与讲解,请阅读以下代码:

#pragma mark - 数组
#pragma mark ** 不可变数组
#if 0 /* 1. 创建不可变数组 */
        NSArray *arr1 = [[NSArray alloc] initWithObjects:@"Apple", @"三星", @"小米", nil];

        /* 2. 获取元素个数 */
        NSLog(@"%lu", arr1.count);

        /* 3. 根据下标获取对象 */
        NSLog(@"%@", [arr1 objectAtIndex:1]);

        /* 4. 遍历数组 */
        for (int i = 0; i < arr1.count; i++) {
            NSLog(@"%@", [arr1 objectAtIndex:i]);
        }

        /* 示例: 查看数组是否有"三星" */
        for (int i = 0; i < arr1.count; i++) {
            NSString *str = [arr1 objectAtIndex:i];
            if ([str isEqualToString:@"三星"]) {
                NSLog(@"咦~ 三星!");
            }
        }

        /* 5. 获取对象在数组中的索引值
         * "小米" 在数组中的索引值
         */
        NSLog(@"%lu", [arr1 indexOfObject:@"小米"]);
#endif

#pragma mark ** 可变数组
#if 0 /* 1. 创建可变数组 */
        NSMutableArray *mArr = [NSMutableArray arrayWithObjects:@"Apple", @"三星", @"小米", nil];
        NSMutableArray *mArr2 = [NSMutableArray arrayWithArray:mArr];

        /* 2. 插入元素
         * 在"三星"后面插入"华为"
         */
        [mArr2 insertObject:@"华为" atIndex:2];
//        for (int i = 0; i < mArr2.count; i++) {
//            NSLog(@"%@", [mArr2 objectAtIndex:i]);
//        }

        /* 添加元素
         * 添加"HTC"
         */
        [mArr2 addObject:@"HTC"];
//        for (int i = 0; i < mArr2.count; i++) {
//            NSLog(@"%@", [mArr2 objectAtIndex:i]);
//        }

        /* 数组嵌套 */
        // 方法1
        NSMutableArray *mArr3 = [NSMutableArray arrayWithObjects:mArr, mArr2, nil];
//        for (int i = 0; i < mArr3.count; i++) {
//            for (int j = 0; j < [[mArr3 objectAtIndex:i] count]; j++) {
//                NSLog(@"%@", [[mArr3 objectAtIndex:i] objectAtIndex:j]);
//            }
//        }
        // 方法2
//        for (int i = 0; i < mArr3.count; i++) {
//            NSMutableArray *arr = [mArr3 objectAtIndex:i];
//            for (int j = 0; j < arr.count; j++) {
//                NSLog(@"%@", [arr objectAtIndex:j]);
//            }
//        }

        /* 删除元素 */
//        [mArr2 removeObject:@"HTC"];
//        [mArr2 removeObjectAtIndex:0];
//        for (int i = 0; i < mArr2.count; i++) {
//            NSLog(@"%@", [mArr2 objectAtIndex:i]);
//        }

        /* 替换元素 */
//        [mArr2 replaceObjectAtIndex:4 withObject:@"魅族"];
//        for (int i = 0; i < mArr2.count; i++) {
//            NSLog(@"%@", [mArr2 objectAtIndex:i]);
//        }

        /* 交换指定位置的两个元素 */
        [mArr2 exchangeObjectAtIndex:0 withObjectAtIndex:4];
        for (int i = 0; i < mArr2.count; i++) {
            NSLog(@"%@", [mArr2 objectAtIndex:i]);
        }
#endif

三、值对象

Objective-C的数组只能存放对象,如果要存储基本数据类型或结构体类型,就需要使用值对象将基本数据类型或结构体类型转换为对象,再将对象存入数组。如果要从数组中读取基本数据类型或结构体类型,应先取出对象,再将对象还原为整型或结构体。

NSNumber

数值对象,完成基本数据类型和对象类型的转换。即基本数据类型(int,float,double,char,NSInteger,CGFloat等)转换为NSNumber,NSNumber转换为基本数据类型。

#pragma mark - NSNumber
#if 0
        int a = 100;
        float f = 3.1f;
        char ch = 'A';
//        NSMutableArray *mArr = [NSMutableArray arrayWithObjects:a, f, ch, nil]; // 尝试基本数据类型直接存入数组, 报错

        /* 将各种类型转换为值对象 NSNumber */
        NSNumber *num1 = [NSNumber numberWithInt:a];
        NSNumber *num2 = [NSNumber numberWithFloat:f];
        NSNumber *num3 = [NSNumber numberWithChar:ch];
        NSMutableArray *mArr = [NSMutableArray arrayWithObjects:num1, num2, num3, nil];

        /* NSNumber 转换为基本数据类型 */
        int a1 = [num1 intValue];
        float f1 = [num2 floatValue];
        char ch1 = [num3 charValue];
#endif

NSValue

结构体(NSRange等)、指针等类型转换为NSValue。NSValue转换为结构体(NSRange等)、指针等。

#pragma mark - 知识点 NSValue
#if 0
        /* 将结构体转换为对象 */
        NSRange range = NSMakeRange(3, 5);
        NSValue *value1 = [NSValue valueWithRange:range];

        /* 将NSValue转换为结构体 */
        NSRange rang1 = [value1 rangeValue];

        NSLog(@"location: %lu", rang1.location);
        NSLog(@"length: %lu", rang1.length);
#endif

四、总结

  • 可变对象通常是不可变对象的子类,其包含父类所有方法,又具有自己独特的方法。
  • 可变对象的增删改等都是对自身的操作,不可变对象的增删改都会生成新的对象,原对象不变。
  • 数组只能存储对象类型的数据,数组元素有顺序,靠下标索引对象。
  • NSNumber、NSValue主要是为了完成标量和对象的互转,便于与collection配合使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值