![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=1739263726-9l5uTuWxey3pO6gFbdLtBAScqQyQmyyF-0-f7441b1f78d05ebceb21a1c4c51b04c4)
- 使用stringWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10772.jpg?sign=1739263726-TsMOOYhsdxeRv455OiBiaRd5cv4OGnjh-0-95d59989d87889a79ef38fa08af5729b)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10774.jpg?sign=1739263726-s20Fv671TRnR1jVkTtikXsJZKy88UA2v-0-b1074c3d6c33387cdafccb51abc6ffca)
- 使用stringWithUTF8String:方法,需要注意的是,调用该方法时,传入的参数是一个字符串,而不是字符串对象(不需要添加@)。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10776.jpg?sign=1739263726-nxIILezuYa5jevxmWiDk4VZb8IdLZdyo-0-02b18910e15a213d4da04314cd840ed9)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10778.jpg?sign=1739263726-YRUJlPEB6eFyx9BOR4qunj9DLEdCWqkR-0-722a65a110c73164b410ac645218033b)
- 使用initWithFormat:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10780.jpg?sign=1739263726-Y1gJrAYG26eb0a5YM62SMPtBmBVR3PPT-0-075f33523a9f422da3c932dd03ec9f0d)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10782.jpg?sign=1739263726-m4gLpxDvS3M2F6386F2w4ePPzj8NxDje-0-e5f186957f7ebc8f7fc2854626f9cba5)
- 使用initWithUTF8String:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10784.jpg?sign=1739263726-7h7u2mOCcpkw2MM1Jux2C0gGB41FcuF0-0-0d30675efc80e66593812cac7d958237)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T90_10786.jpg?sign=1739263726-rksMbJaLB5KYZlNzttY0jh8wTnhQ7m8I-0-5999b8d2cc707959e4d1f79f17c1ece6)
3.字符串比较
在实际开发中,经常会涉及字符串之间进行比较操作,例如:判断两个字符串是否相同,是否有包含关系等。在NSString类中也提供了用于字符串比较的方法。
- 判断字符串是否相同,使用isEqualToString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10918.jpg?sign=1739263726-GRStlYG6qS6vJ2O8RiW7CgpGYJy41BdE-0-840df8ff3804ae1dfb89db5cd1d4cf35)
运行结果如图4-1所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_82829.jpg?sign=1739263726-qdHlQNwm42j339s8Vsgep6cRkRqEB8dw-0-838d4e0c1c03546e002b490f8c3e82c9)
图4-1 运行结果
- 判断字符串中是否包含某个字符串,使用containsString:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10924.jpg?sign=1739263726-uZ294ZIXOpxY3nPvbnPPwNFMttwjWpwi-0-0d82a26dd311d4d02988edce348e5c86)
运行结果如图4-2所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P91_10926.jpg?sign=1739263726-B4UlhjinE7DL3VqGRB5IEx8qNYKj7GaZ-0-82135ea861c89d12b222d9453a3df823)
图4-2 运行结果
- 使用hasPrefix:与hasSuffix:方法,判断字符串的开头与结尾。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T91_10930.jpg?sign=1739263726-6kxPmD5ilOEjN9TcsandaSgQzn8U2R7m-0-c0601707cb3adba34df9912242773f2c)
运行结果如图4-3所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P92_11070.jpg?sign=1739263726-joyYPqVuGTk43gwrt7uvFVnRnn8AQ0Cq-0-a92d565d79a7a3c791ad6a84ab61fc0a)
图4-3 运行结果
4.字符串的拼接与截取
在开发中,时常会涉及对选定字符串进行截取操作,常见的截取有以下3种方式。
- 使用substringFromIndex:方法,获得从指定索引位置开始的字符串,传入的参数表示开始截取的位置,最终截取得到的字符串中不包括参数表示位置的字符。
- 使用substringToIndex:方法,获得从字符串开始到指定索引之间的字符串,最终截取得到的字符串中不包括参数表示位置的字符。
- 从中间截取一段字符串,使用substringWithRange:方法,需要传入一个NSRange类型的参数,用于指明截取的范围。
在下面的示例代码中,介绍了以上3种需要掌握的截取字符串的方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T92_11074.jpg?sign=1739263726-rUa2XxitQ3S5AjQs1Ut6yQ7psKCyHYxc-0-497523f150af75473b04eed62f56c764)
运行结果如图4-4所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11176.jpg?sign=1739263726-do36QKCmFxVeE70ax3FjVyZdVt7Lk00a-0-d19050c3c819119e7f38a906b85607e9)
图4-4 运行结果
5.关于字符串的其他操作
对于NSString类,除了创建字符串对象、对字符串比较以及截取字符串之外,还有以下几个针对字符串的属性和方法相对常用,建议初学者掌握。
- 使用length属性,获取字符串的长度。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11180.jpg?sign=1739263726-95yztuwAKtGXJlbj1BechyZATYg4n5vv-0-b2bd6f606d5bffe0a987e46a584a899f)
运行结果如图4-5所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11182.jpg?sign=1739263726-wqmF7A6hH7YLWoSeObKqAAlxvLh0lZKn-0-a13328df97c3c989067948324a489b76)
图4-5 运行结果
- 使用integerValue方法实现数字字符串与数字的转换。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T93_11186.jpg?sign=1739263726-Xy6w4d3K2f2IOvYVcGKN3CNELaTQ5Qaa-0-a12d3d1a6ab56c49678b4e3ea795eca9)
运行结果如图4-6所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P93_11188.jpg?sign=1739263726-YC3mFSh8AHBuJAMxbvk4YG11yhvBCc7E-0-0e76a4355fc2cdae922111dd7fa6546b)
图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=1739263726-41hnLOOsRlE1FeaYVD1jDTHFzbS3CX5M-0-1d781b6a57e243494efd3d46ef913739)
注意:可变字符串不能使用@""进行赋值,因为使用@""创建的字符串是一个常量字符串。
2.NSMutableString字符串的修改
由于可变字符的特性,决定了可以对可变字符串的内容进行修改,例如插入、拼接等操作。以下代码,演示了对可变字符串进行赋值、拼接等操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T94_11332.jpg?sign=1739263726-P66zFp2fh5ONsgkLbYvrweuz4NTHDRcj-0-ddb0a9e4e7951415caaa8bda4c74448d)
运行结果如图4-7所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11455.jpg?sign=1739263726-TN2FwiYEVbTt4x6GUZxrFP8lDwGVntn1-0-a21fe4c5085d32fbaea1e9f6b7ab6f26)
图4-7 运行结果
3.NSMutableString字符串的替换与删除
对于可变字符串,可以替换其中的一些内容,以及删除一些内容。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11459.jpg?sign=1739263726-KzxcbvkdpeoxXDqWI8HLaoR0wXBy9hgB-0-f3b7633b56d59f1138e36981865879e0)
运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P95_11461.jpg?sign=1739263726-yxeEpzae5TVDs7f9Eql0wsF7m3DWhnhs-0-3492e82e95cf04ed345c4bb5d73964f9)
图4-8 运行结果
4.连接两个字符串对象
使用stringByAppendingString:方法,可以连接两个NSMutableString类型的字符串对象,并返回一个NSString类型的字符串。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T95_11465.jpg?sign=1739263726-37bZ04BFdaAhi0wxBqJFmFSgu4RtfUbj-0-472f343c562c2c12d606101fc0eaac84)
运行结果如图4-9所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P96_11534.jpg?sign=1739263726-umiHHlItiiUUzs2Z95tirLbNFIEdezTG-0-fa152c49420014288a860a78476a2e02)
图4-9 运行结果