
4.2 字符串类
4.2.1 不可变字符串NSString
在Foundation框架中,处理字符串的类就是NSString和NSMutableString。这两个类完成了Objective-C中与字符串相关的核心功能处理。而NSString和NSMutableString两个类最主要的区别是NSString类的字符串对象,在创建赋值后不能动态修改长度和内容,除非重新赋值。而NSMutableString类似于链表,在创建赋值后可以进行修改长度、插入、删除等操作。
1.基本介绍
在使用任何语言进行程序开发,字符串的处理都是一个最常用,也是最基本的操作。在Foundation框架中,提供了一个名为NSString的类,用于处理字符串对象。另外NSString类有一个子类——NSMutableString类,用于处理可变长度的字符串。
在NSString类以及其子类NSMutableString中,定义了诸多与字符串相关的属性以及方法。这些属性和方法会用于字符串的创建、对比、搜索以及修改。
2.创建字符串对象
在NSString中,提供了多个用于字符串创建的方法。但是在实际的开发过程中,通常可以使用以下几种方式来创建一个字符串对象。
- 创建字符串的简便方法,使用@"",把字符串写在引号内。

- 使用stringWithFormat:方法。

示例:

- 使用stringWithUTF8String:方法,需要注意的是,调用该方法时,传入的参数是一个字符串,而不是字符串对象(不需要添加@)。

示例:

- 使用initWithFormat:方法。

示例:

- 使用initWithUTF8String:方法。

示例:

3.字符串比较
在实际开发中,经常会涉及字符串之间进行比较操作,例如:判断两个字符串是否相同,是否有包含关系等。在NSString类中也提供了用于字符串比较的方法。
- 判断字符串是否相同,使用isEqualToString:方法。

运行结果如图4-1所示。

图4-1 运行结果
- 判断字符串中是否包含某个字符串,使用containsString:方法。

运行结果如图4-2所示。

图4-2 运行结果
- 使用hasPrefix:与hasSuffix:方法,判断字符串的开头与结尾。

运行结果如图4-3所示。

图4-3 运行结果
4.字符串的拼接与截取
在开发中,时常会涉及对选定字符串进行截取操作,常见的截取有以下3种方式。
- 使用substringFromIndex:方法,获得从指定索引位置开始的字符串,传入的参数表示开始截取的位置,最终截取得到的字符串中不包括参数表示位置的字符。
- 使用substringToIndex:方法,获得从字符串开始到指定索引之间的字符串,最终截取得到的字符串中不包括参数表示位置的字符。
- 从中间截取一段字符串,使用substringWithRange:方法,需要传入一个NSRange类型的参数,用于指明截取的范围。
在下面的示例代码中,介绍了以上3种需要掌握的截取字符串的方法。

运行结果如图4-4所示。

图4-4 运行结果
5.关于字符串的其他操作
对于NSString类,除了创建字符串对象、对字符串比较以及截取字符串之外,还有以下几个针对字符串的属性和方法相对常用,建议初学者掌握。
- 使用length属性,获取字符串的长度。

运行结果如图4-5所示。

图4-5 运行结果
- 使用integerValue方法实现数字字符串与数字的转换。

运行结果如图4-6所示。

图4-6 运行结果
4.2.2 可变字符串NSMutableString
NSMutableString是继承自NSString类的,所以NSString中定义的所有方法NSMutableString都可以使用。与NSString相比,NSMutableString类的对象在内存中存储的空间是可以变化的,因此,存储的字符串长度和内容都可以改变。
1.NSMutableString的初始化
NSMutableString类的对象,可以采用以下几个方法来进行初始化。
- stringWithCapacity:方法,需要指定初始化时预留的可供存储的字符串最大长度。
- initWithCapacity:方法,需要指定初始化时预留的可供存储的字符串最大长度。
- stringWithString:方法,传入一个初始化字符串。
示例:

注意:可变字符串不能使用@""进行赋值,因为使用@""创建的字符串是一个常量字符串。
2.NSMutableString字符串的修改
由于可变字符的特性,决定了可以对可变字符串的内容进行修改,例如插入、拼接等操作。以下代码,演示了对可变字符串进行赋值、拼接等操作。

运行结果如图4-7所示。

图4-7 运行结果
3.NSMutableString字符串的替换与删除
对于可变字符串,可以替换其中的一些内容,以及删除一些内容。

运行结果如图4-8所示。

图4-8 运行结果
4.连接两个字符串对象
使用stringByAppendingString:方法,可以连接两个NSMutableString类型的字符串对象,并返回一个NSString类型的字符串。

运行结果如图4-9所示。

图4-9 运行结果