![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
4.2 字符串类
4.2.1 不可变字符串NSString
在Foundation框架中,处理字符串的类就是NSString和NSMutableString。这两个类完成了Objective-C中与字符串相关的核心功能处理。而NSString和NSMutableString两个类最主要的区别是NSString类的字符串对象,在创建赋值后不能动态修改长度和内容,除非重新赋值。而NSMutableString类似于链表,在创建赋值后可以进行修改长度、插入、删除等操作。
1.基本介绍
在使用任何语言进行程序开发,字符串的处理都是一个最常用,也是最基本的操作。在Foundation框架中,提供了一个名为NSString的类,用于处理字符串对象。另外NSString类有一个子类——NSMutableString类,用于处理可变长度的字符串。
在NSString类以及其子类NSMutableString中,定义了诸多与字符串相关的属性以及方法。这些属性和方法会用于字符串的创建、对比、搜索以及修改。
2.创建字符串对象
在NSString中,提供了多个用于字符串创建的方法。但是在实际的开发过程中,通常可以使用以下几种方式来创建一个字符串对象。
- 创建字符串的简便方法,使用@"",把字符串写在引号内。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10770.jpg?sign=1738890958-0hQLU7pF5H8SuBLycz8siikCvJ3kOrY8-0-395f7c29231c32b88f06e148d67a0252)
- 使用stringWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10772.jpg?sign=1738890958-5yrdEzx1DBnbBiAjpJgRcaHWozPyi9T7-0-f63a1b6b65e23f8c91baf1715e496be8)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10774.jpg?sign=1738890958-sDqqGOYKp2hkOrvgWjYMBuO05CgAVyAT-0-7ce5bacf06562b208a801fbd02ee3520)
- 使用stringWithUTF8String:方法,需要注意的是,调用该方法时,传入的参数是一个字符串,而不是字符串对象(不需要添加@)。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10776.jpg?sign=1738890958-dmghzHBhOZAuxnQdDGqv3gIzxJkFzyuX-0-bc2f42db7f7f36bd3f4eeb9b7b1d6200)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10778.jpg?sign=1738890958-hA9jmIONhuRHVjfqyDrVqEQ5O7eeghQC-0-97e8e1ceedbe288328bcd3397a1f9021)
- 使用initWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10780.jpg?sign=1738890958-vlFkip6gIbnGk0jcTfklhyU1XWxyqOCZ-0-7606956e19c71069d762e571aa341bcd)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10782.jpg?sign=1738890958-wQoCsMgqAyDuLD16yiT6kXgjgDtM1B1T-0-b40fe2470ffb178c0d6f2b2458c2cdb9)
- 使用initWithUTF8String:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10784.jpg?sign=1738890958-hjsccIxQX62NWNL1NAgFAB9VBYZPFPFH-0-7d779d065877f8b42c2e747115504de1)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10786.jpg?sign=1738890958-FEiCdDqg0er9G5ubSFD0CMYZ9lzJcWx1-0-088dc9ea00b5b35ecd3b2f6999a2cfc7)
3.字符串比较
在实际开发中,经常会涉及字符串之间进行比较操作,例如:判断两个字符串是否相同,是否有包含关系等。在NSString类中也提供了用于字符串比较的方法。
- 判断字符串是否相同,使用isEqualToString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10918.jpg?sign=1738890958-2RuCNULEx9sgpbCkOkjriMB9FbA0wyoa-0-282eb6f15d1c04d485af002c9755e077)
运行结果如图4-1所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_82829.jpg?sign=1738890958-5b7p1ADUTghVLiotTIazlrukQ7Bmt9Ua-0-fd7689096e9470e2f12d1502cc4333e1)
图4-1 运行结果
- 判断字符串中是否包含某个字符串,使用containsString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10924.jpg?sign=1738890958-Vo6SfisWG9oGDJUfr5Q6IDT3pQ0eYxkY-0-ab702b56925444c0666cce5835d04707)
运行结果如图4-2所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_10926.jpg?sign=1738890958-0PfyxFKk4b00dn5M1JlA9tErkBqLlxU9-0-0f9a1e7cc6c869a650a96c003188dcc3)
图4-2 运行结果
- 使用hasPrefix:与hasSuffix:方法,判断字符串的开头与结尾。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10930.jpg?sign=1738890958-UwPQJCn5fM58PIEEopsbeiTeATL5t9Q6-0-dd715c82ae1486a19c6d3bdeb274a23b)
运行结果如图4-3所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P92_11070.jpg?sign=1738890958-3IZ85ivREIcXdKcNtCjNe3yS5N1mdQPw-0-55d7d4a965a57e68fd371778e07d072e)
图4-3 运行结果
4.字符串的拼接与截取
在开发中,时常会涉及对选定字符串进行截取操作,常见的截取有以下3种方式。
- 使用substringFromIndex:方法,获得从指定索引位置开始的字符串,传入的参数表示开始截取的位置,最终截取得到的字符串中不包括参数表示位置的字符。
- 使用substringToIndex:方法,获得从字符串开始到指定索引之间的字符串,最终截取得到的字符串中不包括参数表示位置的字符。
- 从中间截取一段字符串,使用substringWithRange:方法,需要传入一个NSRange类型的参数,用于指明截取的范围。
在下面的示例代码中,介绍了以上3种需要掌握的截取字符串的方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T92_11074.jpg?sign=1738890958-58Ddt1gcgTzDd8nFCBEoVICfkOwHGHUd-0-01a529e4a0bd6f905ce5aa6d1ff40427)
运行结果如图4-4所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11176.jpg?sign=1738890958-uBtdoL1zTJsIZarTVWN7MJom7Rax3DTe-0-048234d3d79d6557e4a13fa89116af9c)
图4-4 运行结果
5.关于字符串的其他操作
对于NSString类,除了创建字符串对象、对字符串比较以及截取字符串之外,还有以下几个针对字符串的属性和方法相对常用,建议初学者掌握。
- 使用length属性,获取字符串的长度。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11180.jpg?sign=1738890958-bWG9a0rDvmdGwtH9hq4S44COiAM5Blzv-0-600dcf69e049b1e003f9e0cc0837e5ad)
运行结果如图4-5所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11182.jpg?sign=1738890958-ciNewroCRtGCiHIwFpozeKO7Af86lsBM-0-34443ebe6d9504fe464f904f4ef55c2e)
图4-5 运行结果
- 使用integerValue方法实现数字字符串与数字的转换。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11186.jpg?sign=1738890958-mdZX1iUPhQetao2NIJ6saKcUm5jE2paj-0-b123eb044d2f1bd84303d045ca839d6e)
运行结果如图4-6所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11188.jpg?sign=1738890958-CH8zf8X1YTvg4kMnL2IsUOayt8xQVycG-0-1fcf9f240cd5197942c763eab9818f45)
图4-6 运行结果
4.2.2 可变字符串NSMutableString
NSMutableString是继承自NSString类的,所以NSString中定义的所有方法NSMutableString都可以使用。与NSString相比,NSMutableString类的对象在内存中存储的空间是可以变化的,因此,存储的字符串长度和内容都可以改变。
1.NSMutableString的初始化
NSMutableString类的对象,可以采用以下几个方法来进行初始化。
- stringWithCapacity:方法,需要指定初始化时预留的可供存储的字符串最大长度。
- initWithCapacity:方法,需要指定初始化时预留的可供存储的字符串最大长度。
- stringWithString:方法,传入一个初始化字符串。
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T94_11330.jpg?sign=1738890958-kKEcZXqaAK4woCntiCgKCP2J56dWr6as-0-ca18b1b784728e7fd2654f7cfc04b8a2)
注意:可变字符串不能使用@""进行赋值,因为使用@""创建的字符串是一个常量字符串。
2.NSMutableString字符串的修改
由于可变字符的特性,决定了可以对可变字符串的内容进行修改,例如插入、拼接等操作。以下代码,演示了对可变字符串进行赋值、拼接等操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T94_11332.jpg?sign=1738890958-nlAaa8TDxq8gIc2isjPGQ8WRFO0FiRyK-0-d6bedf77e58e3d0de6e27b0b3bdc18ce)
运行结果如图4-7所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11455.jpg?sign=1738890958-yzUHHxm5gIP2Qq4yMqN8HU13gnNZ8Yos-0-77e2404cb6e9ebb09684c4798497442c)
图4-7 运行结果
3.NSMutableString字符串的替换与删除
对于可变字符串,可以替换其中的一些内容,以及删除一些内容。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11459.jpg?sign=1738890958-SjBJumxAgOjV48AMmOkXLfcJgvl5bIYm-0-146aa21a19f28edc4135d1ca22abb59b)
运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11461.jpg?sign=1738890958-ostdZi3tKRA8Al8mUODaI50fc3V0YTAf-0-ca33050ef6bb33943ff27a098664bf45)
图4-8 运行结果
4.连接两个字符串对象
使用stringByAppendingString:方法,可以连接两个NSMutableString类型的字符串对象,并返回一个NSString类型的字符串。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11465.jpg?sign=1738890958-EDImqVIHNmKI1Pi2Xn3XZU8TCqKHp9w7-0-2f7f7bdaf9f9a1a77023d8df859ed8cd)
运行结果如图4-9所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P96_11534.jpg?sign=1738890958-s08HaRLdbLevmafTUgf8dYkx6cGGYJQR-0-4fcbd050e39f3fc8775a5d282657fbd7)
图4-9 运行结果