iOS OC(四) 字符串NSString 可变数组NSMutableArray 不可变数组NSArray 数值对象类NSNumber NSValue 数值对象类NSNumber

不可变字符串NSString

1. 利用系统的类 初始化一个对象

  • 创建一个NSString对象, 调用其自定义初始化方法, 并对其进行初始化 
    NSString *str = [[NSString alloc] initWithString: @"123"]; 
    相当于

    NSString *str = @"123";
    NSLog(@"%@", str);
    
    • 1
    • 2
    • 3
    打印结果为123
    
  • 用系统的便利构造器方法初始化对象 用格式化初始方法 

    NSString *str2 = [NSString stringWithFormat:@"aaa%@", str]; 
    NSLog(@"%@", str2); 

    打印结果为aaa123
    

2. 利用创建的对象 调用系统的方法

先定义一个字符串对象如下: 
NSString *str = @“hello world”; 
下面介绍一些NSString类中常用的一些方法及解释

1.获得字符串长度

  • @property (readonly) NSUInteger length; 
    length是NSString类的属性, 它保存着字符串对象的长度. 
    可以用点语法获得, 也可以调用get方法获得它的值.

    NSUInteger len = [str length]; // 用get方法获得字符串对象的长度
    NSLog(@"%lu", len);
    • 1
    • 2

2. 获取子字符串(字符串截取)

   注: 字符串中的每个字符都有下标, 下标从0开始, 从左往右第一个字符的下标是0, 最后一个字符的下标是长度-1  

  1. - (NSString *)substringFromIndex:(NSUInteger)from; 
    解释: 从下标from开始(包含下标from所在的字符), 截取到最后 
    用法如下:

    NSString *strFrom = [str substringFromIndex:6]NSLog(@"%@", str1);
    • 1

    结果为world

  2. - (NSString *)substringToIndex:(NSUInteger)to; 
    解释: 从第一个字符开始, 截取到下表为to的位置(不包含下标to所在的字符) 
    用法如下:

    NSString *strTo = [str substringToIndex:5];NSLog(@"%@", strTo);
    • 1

    结果为hello

  3. - (NSString *)substringWithRange:(NSRange)range; 
    解释: 从指定的范围range中截取一段字符

    • p.s. NSRange的定义如下

      typedefstruct _NSRange { 
          NSUInteger location; // 表示范围的开始 
          NSUInteger length; // 表示范围的长度 
      } NSRange; 
                                          // 系统创建NSRange变量的方法
      NS_INLINE NSRange NSMakeRange(NSUInteger loc, NSUInteger len) {
          NSRange r;
          r.length = len; 
          return r;
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

        可以通过 NSRange range = {2, 2};或者 NSRange range = NSMakeRange(2, 2); 来创建并初始化NSRange对象 
         第一个参数是开始的地点, 第二个参数是长度 
         range 表示下表从2开始, 长度为2的范围. 
        用法如下:

      NSRange range = NSMakeRange(2, 2);
      NSString *str1 = [str substringWithRange:range];
      NSLog(@"%@", str1);
      • 1
      • 2
      • 3

        结果为ll

  4. - (NSArray *)componentsSeparatedByString:(NSString *)separator; 
      解释:将一个字符串作为分隔符, 遇到该分隔符就将字符串截为分隔符前, 和分隔符后的两段. 且两段字符串均不包含分隔符. 截取结果保存在数组里. 
      用法如下: 
      截取字符串“20|http://www.baidu.com”中 “|” 前⾯和后⾯的字符串

    NSString *string = @"20|http://www.baidu.com"; 
    NSArray *result = [string componentsSeparatedByString:@"|"]; 
    NSLog(@"%@", result);
    • 1
    • 2
    • 3

    结果为: 

    20, 
    “http://www.baidu.com” 
    )

3.拼接字符串

  1. - (NSString *)stringByAppendingString:(NSString *)aString; 
       解释: 将字符串aString拼接到当前字符串的结尾 
       用法如下: 
      

    NSString *string = @"!!";
    NSString *result = [str1 stringByAppendingString:string];
    NSLog(@"%@", result);
    • 1
    • 2
    • 3

    结果为hello world!!

      或者:

    NSString *result = [str1 stringByAppendingString:@"!!"];
    NSLog(@"%@", result);
    • 1
    • 2

    结果也是hello world!!

  2. -(NSString*)stringByAppendingFormat:(NSString*)format, ...NS_FORMAT_FUNCTION(1,2); 
      解释:格式化拼接字符串 
      用法如下:

    NSString *newString = @"aa";
    NSString *result = [str1 stringByAppendingFormat:@"%@", newString];
    NSLog(@"%@", result);
    • 1
    • 2
    • 3

    结果为:hello worldaa

    或者:

    NSString *result = [str1 stringByAppendingFormat:@"%@", @"aa"];
    NSLog(@"%@", result);
    • 1
    • 2

4.替换字符串

  1. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement NS_AVAILABLE(10_5, 2_0);
      解释: 给一个目标字符串和一个目的字符串, 在本字符串中搜索, 出现目标字符串相同的字符串, 就替换成目的字符串 
      用法如下:

    NSString *result = [str1 stringByReplacingOccurrencesOfString:@"he" withString:@"eh"];
    NSLog(@"%@", result);
    • 1
    • 2

    结果为:ehllo world

  2. - (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement NS_AVAILABLE(10_5, 2_0);
      解释: 按范围替换字符串 
      

    NSRange range = NSMakeRange(2, 2);
    NSString *result = [str1 stringByReplacingCharactersInRange:range withString:@"1"];
    NSLog(@"%@", result);
    • 1
    • 2
    • 3

      结果为:he1o world

5.字符串相等

  • - (BOOL)isEqualToString:(NSString *)aString; 
      解释: 判断两个字符串是否相同 如果相同返回1, 不相同返回0 
      用法如下:

    NSString *str1 = @"Hello World";
    NSString *str2 = @"Hello world";
    if ([str1 isEqualToString: str2]) {
        NSLog(@"相同");
    } else {
        NSLog(@"不相同");
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

      结果是: 不相同

6.字符串比较

  • - (NSComparisonResult)compare:(NSString *)string; 
      解释如下:用本字符串和目标字符串string进行比较 如果两个字符串相同, 返回0, 本字符串比目标字符串小则返回-1, 反之返回1

    • NSComparisonResult的定义如下

      typedef NS_ENUM(NSInteger, NSComparisonResult) {
          NSOrderedAscending = -1L,
          NSOrderedSame,
          NSOrderedDescending 
      };
      • 1
      • 2
      • 3
      • 4
      • 5

        NS_ENUM是OC中的枚举方法.括号中的两个参数NSInteger和NSComparisonResult分别表示枚举方法中数据的类型, 和枚举方法的方法名

7.判断包含某个前缀(后缀)

  • - (BOOL)hasPrefix:(NSString *)aString; 
      功能: 判断字符串是否带有前缀aString 
      解释: 从本字符串和目标字符串两者各自的第一个字符同时开始进行遍历,并一一比较, 直到目标字符串遍历完毕. 若没有出现不同的字符, 则返回1, 出现了不同字符, 返回0 
      
  • - (BOOL)hasSuffix:(NSString *)aString; 
      功能: 判断字符串是否含有后缀aString 
      解释: 从本字符串和目标字符串的最后一个字符开始从后往前进行遍历,并一一比较, 直到目标字符串遍历完毕. 若没有出现不同的字符, 则返回1, 出现了不同字符, 返回0

8.字符串字母大小写转换

  • 转换为大写 
      @property (readonly, copy) NSString *uppercaseString; 
      功能: 将字符串所有字母转化为大写 
      
  • 转换为小写 
      @property (readonly, copy) NSString *lowercaseString; 
      功能: 将字符串所有字母转化为小写 
      
  • 每个单词的首字母变大写 除首字母外的字符小写 
      @property (readonly, copy) NSString *capitalizedString; 
      功能: 自动识别字符串中的每个单词, 并把每个单词的首字母大写, 其余字母小写

9.不可变字符串如果重新赋值的话, 改变的不是其本身 而是进行了重指向 指向了一个新的字符串


可变字符串NSMutableString

可变字符串NSMutableString是继承于NSString的一个类

但是可变字符串不能使用定义声明方式如下 
NSMutableString *str = @"123"; 
因为 
NSString *str1 = @"123"; 相当于字符串对象str 指向了常量区中的字符串 @”123” 
str1是不可变字符串的对象, 所以指向一个不可变的数据没有问题.

但是 由于可变字符串NSMutableString 是可变的 
若是让其指向 常量区中的常字符串 @“123” 结果就是可变字符串对象str指向了一个不可变的数值 
这显然不符合可变字符串的定义 
所以OC禁止可变字符串使用这种便利方式初始化字符串

但是NSMutableSring依然可以使用继承自NSString的字符串方法如下: 
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"sss"]; 
也可以调用自身的便利构造器方法: 
NSMutableString *str = [NSMutableString stringWithString:@"sgr"];

可变字符串的常用方法:

1.拼接字符串

// 在字符串的末尾添加字符串aString
- (void)appendString:(NSString *)aString;

// 在字符串的末尾格式化添加字符串
- (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.插入字符

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc; 
在字符串的下标为loc处插入字符串aString 原来loc+1处的开始的字符串自动添加到插入的字符串aString后面.

3.替换字符

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString; 
在指定范围range内的字符串全部移除, 将字符串aString自动加入被移除的位置, 断处自动相连.

4.删除字符

- (void)deleteCharactersInRange:(NSRange)range; 
将范围range内的全部字符删除, 剩余的字符串自动按顺序连接起来

注意的是可变字符串的方法返回值都是void,它改变的都是自身保存的字符串 所以不需要返回一个新的字符串


不可变数组NSArray

NSArray 只能存对象 为了操作方便 一般也是存同一类型的对象 
数组也称为一种容器 
常用的初始化方法:

+ (instancetype)array;
+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray *)array;
- (instancetype)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray *)array;
                              // 读取一个文件, 数据保存在一个数组里并返回
+ (NSArray *)arrayWithContentsOfFile:(NSString *)path;
                              // 从一个网址获得结果, 数据保存在数组里并返回
+ (NSArray *)arrayWithContentsOfURL:(NSURL *)url;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创建一个不可变数组的对象:

NSArray *array = [[NSArray alloc] initWithObjects:@"str1", @"str2", @"str3", nil];
NSArray *array2 = [NSArray arrayWithObjects:@"str1", @"str2", @"str3", nil];
NSLog(@"%@\n%@",array, array2);
  • 1
  • 2
  • 3

语法糖 快速构建数组的方法 
NSArray *array3 = @[@"str1", @"str2", @"str3"];

打印数组元素的方法 
可以通过NSLog(@"%@", array);打印出array数组中的所有元素 但是不能输出中文. 因为NSArray 中的description不支持输出中文, 但是会输出中文的unicode编码

也可以通过下标打印一个元素 
NSLog(@"%@", array2[0]); // 打印出array2数组的第一个元素 此时第一个元素中是一个字符串对象, NSString 字符串中的description是支持打印出中文的

获得数组元素的首元素和最后一个元素

@property (nonatomic, readonly) id firstObject NS_AVAILABLE(10_6, 4_0);
@property (nonatomic, readonly) id lastObject;
  • 1
  • 2

切记 若要对一个不可变数组在不创建另一个不可变数组的情况下直接进行增删改查是做不到的


可变数组NSMutableArray

常用初始化方法: 
+ (instancetype)array; 
值得注意的是, 所有可变数组的操作. 都必须在可变数组初始化以后才可以进行.

常用其他方法

- (void)addObject:(id)anObject; // 往数组内添加元素的方法
                    // 插入元素的方法, 插入后原来此位置的元素自动后移
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
        // 删除指定元素的方法, 删除下标所在的元素, 删除后, 后面的元素自动前移
- (void)removeObjectAtIndex:(NSUInteger)index;
                        // 将不可变数组的全部元素添加到可变数组中
- (void)addObjectsFromArray:(NSArray *)otherArray;
- (void)removeAllObjects;    // 删除数组中所有的元素(清空)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

数值对象类NSNumber

初始化方法:

- (NSNumber *)initWithChar:(char)value NS_DESIGNATED_INITIALIZER;
+ (NSNumber *)numberWithChar:(char)value;
  • 1
  • 2

NSNumber 的作用是将基本类型的变量转变成对象, 方便存放在OC的数组里面 
它支持所有的基本数据类型, 所有基本数据类型的变量都可以和NSNumber互相转化

另外, 利用这一点, 也可以完成将基本数据类型之间互相转换. 
比如:

    float a = 5.6;
    NSNumber *num = [NSNumber numberWithFloat:a];
    int b = [num intValue];
  • 1
  • 2
  • 3

当然 通常情况下这种功能并没有什么卵用.


NSValue

支持将结构体变量转化成对象类型.

利用NSNumber 和 NSValue 将基本数据类型保存到NSMutableArray中并遍历数组, 获得结果

    int num1 = 5;
    float num2 = 3.8;
    double num3 = 4.0;
    BOOL num4 = YES;
    NSRange range = NSMakeRange(3, 5);

                                        // 将基本数据类型转化成NSNumber对象
    NSNumber *intValue = [NSNumber numberWithInt:num1];
    NSNumber *floatValue = [NSNumber numberWithFloat:num2];
    NSNumber *doubleValue = [NSNumber numberWithDouble:num3];
    NSNumber *boolValue = [NSNumber numberWithBool:num4];
                                        // 将结构体变量转化成NSValue对象
    NSValue *rangeValue = [NSValue valueWithRange:range];

    NSMutableArray *array = [NSMutableArray array];
    [array addObject:intValue];
    [array addObject:floatValue];
    [array addObject:doubleValue];
    [array addObject:boolValue];

 // 由于数组中可以保存一切对象, 所以可以将NSNumber 和NSValue对象一起保存在数组中
    [array addObject:rangeValue];
                                        // 遍历数组
    for (int i = 0; i < [array count]; i++) {
        NSLog(@"%@", array[i]);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

你可能感兴趣的:(OC语言)