![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=1738833875-49MHZOmhll1lCiJAqZ8RhV3jbeGKEc6V-0-c6090522a595305a46f5b12815a9368a)
- 使用stringWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10772.jpg?sign=1738833875-6EhI7NH0fMBGNLw2C2XMA6vdAwM52pBG-0-6ed7d3114d7324894652b291f304ff78)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10774.jpg?sign=1738833875-RoFbmdtpJe3sf6rF8uRwVfPJu2BZz9QG-0-eb2d0784ab47c061f645ab80af649ecc)
- 使用stringWithUTF8String:方法,需要注意的是,调用该方法时,传入的参数是一个字符串,而不是字符串对象(不需要添加@)。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10776.jpg?sign=1738833875-odtrnzBGY9avbejpu6DkUMQagOeoaZfn-0-11067c419545c555f69eca744e14d70e)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10778.jpg?sign=1738833875-XNihXvUVyT7U1UGLXgk29KPigoyhlxb5-0-0ffdc084cee2a9089ab3828e6f8a51e1)
- 使用initWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10780.jpg?sign=1738833875-k7lSTbWiDq7PvMsCHyue2JTZKmk2IP2Q-0-5b2e954559136c167a34cf0ab638d250)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10782.jpg?sign=1738833875-i2kFmkwaTBNSt63AXnSm4hDfqzvlnNfR-0-7afe6ab8bcc80490adef35178e5dbf12)
- 使用initWithUTF8String:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10784.jpg?sign=1738833875-3wgAR7cXd2CSfSlB4Tgjwolb4lH9nrmy-0-0c9a712550d28d526cee6d977763930c)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10786.jpg?sign=1738833875-l1nWISqWTS8uzUevlAvky0bUaDILZrAz-0-f61beef1d7027140d9c4b7e2ff454e4f)
3.字符串比较
在实际开发中,经常会涉及字符串之间进行比较操作,例如:判断两个字符串是否相同,是否有包含关系等。在NSString类中也提供了用于字符串比较的方法。
- 判断字符串是否相同,使用isEqualToString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10918.jpg?sign=1738833875-4MLvVEvxDzUFqY6K36BlmTnIKDiCGV25-0-6d1cbc66aac208a32422b031aea805d6)
运行结果如图4-1所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_82829.jpg?sign=1738833875-Eba54KifWomZ4uyX8oLKTcxWxQgE9QWW-0-6f4ab2e8e1ff05c7c99bf91ccb3c4b03)
图4-1 运行结果
- 判断字符串中是否包含某个字符串,使用containsString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10924.jpg?sign=1738833875-1yfW44jX7FpcUb5WHjTyBQBeWsCh7eoZ-0-9982641b79f1645de03c79ef2b4a0061)
运行结果如图4-2所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_10926.jpg?sign=1738833875-1hz5VpRmR79ahjjwS3DT022d7D4Hdvbq-0-35ba952adc070234847e306764ebd743)
图4-2 运行结果
- 使用hasPrefix:与hasSuffix:方法,判断字符串的开头与结尾。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10930.jpg?sign=1738833875-goHGVcTS8QUPRZLyLhKJye7hOK9vFaM1-0-886c924ed1088674f9be433b54f1d06f)
运行结果如图4-3所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P92_11070.jpg?sign=1738833875-SHNxLryTReBKXs4yu3Qq3vis1mdYHNvB-0-f6756811fede196e872f88cf8e18b9af)
图4-3 运行结果
4.字符串的拼接与截取
在开发中,时常会涉及对选定字符串进行截取操作,常见的截取有以下3种方式。
- 使用substringFromIndex:方法,获得从指定索引位置开始的字符串,传入的参数表示开始截取的位置,最终截取得到的字符串中不包括参数表示位置的字符。
- 使用substringToIndex:方法,获得从字符串开始到指定索引之间的字符串,最终截取得到的字符串中不包括参数表示位置的字符。
- 从中间截取一段字符串,使用substringWithRange:方法,需要传入一个NSRange类型的参数,用于指明截取的范围。
在下面的示例代码中,介绍了以上3种需要掌握的截取字符串的方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T92_11074.jpg?sign=1738833875-sOe65YczuM3bzYpTuiXWFQcLc5xysxmS-0-c20ea250f49eeefec2cb03f23912c153)
运行结果如图4-4所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11176.jpg?sign=1738833875-7oJx1kJb60EqTh3Bdjx82fsoz44oGOka-0-72673c49be7072d329d7ed3022edbb38)
图4-4 运行结果
5.关于字符串的其他操作
对于NSString类,除了创建字符串对象、对字符串比较以及截取字符串之外,还有以下几个针对字符串的属性和方法相对常用,建议初学者掌握。
- 使用length属性,获取字符串的长度。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11180.jpg?sign=1738833875-B3HdlTXOhItz2vMopVUVjs48TezyvA1H-0-224f5c7e60863a1cd076cff8a3da3aed)
运行结果如图4-5所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11182.jpg?sign=1738833875-dtpmALoez49gmWZe3zrx0KFDCyMvnUhE-0-92f6b35587a381e719d7ef03704e7c30)
图4-5 运行结果
- 使用integerValue方法实现数字字符串与数字的转换。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11186.jpg?sign=1738833875-Vxb5XlM6H76utduiNd4Y7hH3AcmMtkDn-0-b088f4e75d9ee00558d0aac6a710e1f8)
运行结果如图4-6所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11188.jpg?sign=1738833875-GsJiJkrFKhseldWyFMECAXkYKYukKfcy-0-6cf28860ff257c49871b569b2e491f28)
图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=1738833875-dynPpotjhJ8ODVJ7U1pj7y4Z3gos5uqj-0-6008220646684d699752ec5026830840)
注意:可变字符串不能使用@""进行赋值,因为使用@""创建的字符串是一个常量字符串。
2.NSMutableString字符串的修改
由于可变字符的特性,决定了可以对可变字符串的内容进行修改,例如插入、拼接等操作。以下代码,演示了对可变字符串进行赋值、拼接等操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T94_11332.jpg?sign=1738833875-mXtSMZzHlrWxSIbxTaYZGgBXMkJFOdq1-0-e5c1aa890c360c667cc896fd271e3c0a)
运行结果如图4-7所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11455.jpg?sign=1738833875-mXHKvss2y5Kr81oLUHGoMKHdjuayZXr9-0-04a94d223975c1298e5769c5be11f649)
图4-7 运行结果
3.NSMutableString字符串的替换与删除
对于可变字符串,可以替换其中的一些内容,以及删除一些内容。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11459.jpg?sign=1738833875-Dph0Mnz6ixiu2V1m41xAzgeomXTCh2Rk-0-3b7f8d1019a7128c9da4af6e9aad8dca)
运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11461.jpg?sign=1738833875-sghcGyTmif9YI9TANTgLbe96SjX4eFUo-0-e8553d9cf5a5b39206b13711da18fd5c)
图4-8 运行结果
4.连接两个字符串对象
使用stringByAppendingString:方法,可以连接两个NSMutableString类型的字符串对象,并返回一个NSString类型的字符串。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11465.jpg?sign=1738833875-0ic1YcMF8HNnqKnvOXWyzZhLM9NCYazU-0-4ef3be133423b103ad1c320a83388357)
运行结果如图4-9所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P96_11534.jpg?sign=1738833875-gReKB0zJbw4MFwyjdKQSm3LSb0uPcHSl-0-5353df9c78de9c7c6a109bc5c31390b2)
图4-9 运行结果