![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=1738910623-RI5rSXzmsqHT0F0OjK2G1r50axTMKBQB-0-0a8d85a85c1a7b26846a2b0f5a7d42ae)
- 使用stringWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10772.jpg?sign=1738910623-OhS2356yBxHq19VMvBHitAu7YZ7Iw7Ej-0-734b07f72a029733470c8ce0b70d6c75)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10774.jpg?sign=1738910623-QL1hAfv5StE56SDylopGAoRg5a84ACge-0-3f58fbbbefd4bad6c2673c0e0e52030a)
- 使用stringWithUTF8String:方法,需要注意的是,调用该方法时,传入的参数是一个字符串,而不是字符串对象(不需要添加@)。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10776.jpg?sign=1738910623-i7yCFtqw3nJHI4UlgoAaS5Cz1VRONOih-0-d27330ae95fc633ddb58ab1373606dd5)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10778.jpg?sign=1738910623-dFw5jRTWu7OhtZVjw29Kttvgk0veC5ne-0-3071f94e16f5c807c9d80b7779e6fd11)
- 使用initWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10780.jpg?sign=1738910623-W0aXI6YdUy87JBAUsdhc1qmLJ07eMTSN-0-eb0037b03d4bb25fbb42868f23191d6c)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10782.jpg?sign=1738910623-q84eAMLwR95cJu8F0RQiYihGOgie3CfQ-0-ba5d127b968bd470065bd7e6cf49c58a)
- 使用initWithUTF8String:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10784.jpg?sign=1738910623-ldituNVthiAmwHs2VP7GvRthWkSiDKOW-0-aad53ec75bbd1e62845aa3cfb18b2f6c)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10786.jpg?sign=1738910623-AsTmqBOhPye57c7Dk1G6Cds8XX80WznI-0-1c72ee055d0bcbe9c76b6253283e37ed)
3.字符串比较
在实际开发中,经常会涉及字符串之间进行比较操作,例如:判断两个字符串是否相同,是否有包含关系等。在NSString类中也提供了用于字符串比较的方法。
- 判断字符串是否相同,使用isEqualToString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10918.jpg?sign=1738910623-WeBMhkz3bagi2babj2J2x78kDCGoRisX-0-9167f1823dd01a77b987a5968a62f7a8)
运行结果如图4-1所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_82829.jpg?sign=1738910623-V0HhQ5nu7DlcGlkrA3AsCe5i263iJ0hu-0-29c5f04f7f0cb2b496233f9ef8ec80af)
图4-1 运行结果
- 判断字符串中是否包含某个字符串,使用containsString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10924.jpg?sign=1738910623-XSfv63SLgz0IZnFfZIgTTu3gttjp2tvf-0-967ea88fe5aac38fa99b50aca115451f)
运行结果如图4-2所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_10926.jpg?sign=1738910623-zxUBh1xr0xdP4SyqAzzkbi33xtawkba2-0-06a48e23e605e0000655323defdeb3d9)
图4-2 运行结果
- 使用hasPrefix:与hasSuffix:方法,判断字符串的开头与结尾。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10930.jpg?sign=1738910623-eikiZlzFDyuCaqg2lxbOa3o8nJOvnT44-0-2f417d9cc76dd2c1c511d0569869c210)
运行结果如图4-3所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P92_11070.jpg?sign=1738910623-NGAAiKa107b4HdPXBJdIzljs0psiBHvp-0-956f87b5f94bb96b2b652b233c9c6f6b)
图4-3 运行结果
4.字符串的拼接与截取
在开发中,时常会涉及对选定字符串进行截取操作,常见的截取有以下3种方式。
- 使用substringFromIndex:方法,获得从指定索引位置开始的字符串,传入的参数表示开始截取的位置,最终截取得到的字符串中不包括参数表示位置的字符。
- 使用substringToIndex:方法,获得从字符串开始到指定索引之间的字符串,最终截取得到的字符串中不包括参数表示位置的字符。
- 从中间截取一段字符串,使用substringWithRange:方法,需要传入一个NSRange类型的参数,用于指明截取的范围。
在下面的示例代码中,介绍了以上3种需要掌握的截取字符串的方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T92_11074.jpg?sign=1738910623-slP1gTqNazpcagLHTsvOk2mHgmaAkBd5-0-6f7f174cdd997330003aa425c33ec652)
运行结果如图4-4所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11176.jpg?sign=1738910623-XaD0x61QYAwiHcOybFVwtiZnVTRlKv4l-0-bd6ddf4794686d92693e69a5e4315f76)
图4-4 运行结果
5.关于字符串的其他操作
对于NSString类,除了创建字符串对象、对字符串比较以及截取字符串之外,还有以下几个针对字符串的属性和方法相对常用,建议初学者掌握。
- 使用length属性,获取字符串的长度。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11180.jpg?sign=1738910623-5x77t0UR6ThwMHxMILaMIMrPDdAeqZvq-0-867f7a072ec007c70bd25875ae532397)
运行结果如图4-5所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11182.jpg?sign=1738910623-3u8jFTjR5PYYcH2DHzTG1ofKB8mrFn6G-0-e2e25a9b511471b61c8c095b07e18c2c)
图4-5 运行结果
- 使用integerValue方法实现数字字符串与数字的转换。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11186.jpg?sign=1738910623-Rz4LMlHX7kVO9p5uOnTfTQm6pdh4eBx8-0-aefe5f7b9caafdd245636b808324c7f6)
运行结果如图4-6所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11188.jpg?sign=1738910623-fzQihQz5pyZYLpKHQHRpuI0gJfejTKlp-0-b483067982d301cafdfe1d2ba0b7372e)
图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=1738910623-EFM9ARwuMPq6Y19nsJuK3qnqZHRJecyz-0-70bf6bfecbf16c751113f3000f111336)
注意:可变字符串不能使用@""进行赋值,因为使用@""创建的字符串是一个常量字符串。
2.NSMutableString字符串的修改
由于可变字符的特性,决定了可以对可变字符串的内容进行修改,例如插入、拼接等操作。以下代码,演示了对可变字符串进行赋值、拼接等操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T94_11332.jpg?sign=1738910623-AxJNofjYeOXDuerCeNXkyYzIaVipbgNx-0-f74cc2e509d0cbb48aee55e9bc86743c)
运行结果如图4-7所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11455.jpg?sign=1738910623-HvK1YP4Bx7xhDfLBzCMq219UhoSNGLsR-0-4d6c71c8d4d013dfdcd8ffe05611b532)
图4-7 运行结果
3.NSMutableString字符串的替换与删除
对于可变字符串,可以替换其中的一些内容,以及删除一些内容。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11459.jpg?sign=1738910623-G1izyt9Bh36jl6LUlvwWtBxeDnMklA2g-0-68c4befa1c85bf4acf58e4d894c673d9)
运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11461.jpg?sign=1738910623-8XQCEigDx87KpAIIt1SyiWWGDEJgPPvA-0-8667b41c7da21724c6bae8e3be481d45)
图4-8 运行结果
4.连接两个字符串对象
使用stringByAppendingString:方法,可以连接两个NSMutableString类型的字符串对象,并返回一个NSString类型的字符串。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11465.jpg?sign=1738910623-rIJXgCqFAyE7sasPqOEkSifyGxegckwL-0-faab4eaae5a16801b840500dc3b7919f)
运行结果如图4-9所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P96_11534.jpg?sign=1738910623-i0QOcEpONXRklB2f06X67Pvtb4vCNxN2-0-2ee809dd6cf013faab820aef8149663f)
图4-9 运行结果