19.2 字符串类

在Foundation框架中,字符串类有两种:不可变字符串类NSString和可变字符串类NSMutableStringNSString是定义固定大小的字符串,NSMutableString可对字符串做追加、删除、修改、插入和拼接等操作,而不会产生新的对象。

19.2.1 NSString

NSString是不可变字符串类,如果对字符串进行拼接等操作会产生新的对象。创建NSString对象的方法与NSNumber类似,有两种方式,这里不再赘述。

NSString有很多方法,下面总结的是常用属性和方法。

  • +stringWithString: 静态工厂创建方法创建NSString对象,NSString构造方法还有很多。

  • -length 返回Unicode字符的长度属性。

  • -stringByAppendingString: 实现了字符串的拼接,这个方法会产生下一个新的对象。

  • -isEqualToString: 较两个字符串是否相等。

  • -compare: 比较两个字符串大小。

  • -uppercaseString 换成为大写属性。

  • -lowercaseString 换成为小写属性。

  • -substringToIndex: 可以获得字符串的前x个字符串。

  • -substringFromIndex: 可以截取x索引位置到尾部字符串。

  • -rangeOfString: 字符串查找。

提示 由于上述方法或属性是按照Objective-C语言命名的,其中方法或属性前面的“-”表示实例方法或属性,而“+”表示静态方法或属性。“:”结尾说明是方法名,而且后面有参数。

下面看NSString字符串示例代码:

  1. var str1 : NSString = "aBcDeFgHiJk"
  2. var str2 : NSString = "12345"
  3. var res : NSString
  4. var compareResult : NSComparisonResult
  5. var subRange : NSRange
  6. //字符个数
  7. NSLog("字符串str1长度: %i",str1.length) //输出:11 ②
  8. //复制字符串到res
  9. res = NSString.stringWithString(str1)
  10. NSLog("复制: %@", res) //输出:aBcDeFgHiJk ④
  11. //复制字符串到str1尾部
  12. str2 = str1.stringByAppendingString(str2)
  13. NSLog("连接字符串: %@", str2) //输出:aBcDeFgHiJk12345
  14. //测试字符串相等
  15. if str1.isEqualToString(res) == true {
  16. NSLog("str1 == res")
  17. } else {
  18. NSLog("str1 != res")
  19. }
  20. //输出:str1 == res
  21. //测试字符串<> ==
  22. compareResult = str1.compare(str2)
  23. switch compareResult {
  24. case .OrderedAscending:
  25. NSLog("str1 < str2")
  26. case .OrderedSame:
  27. NSLog("str1 == str2")
  28. Default:
  29. NSLog("str1 > str2")
  30. }
  31. //输出:str1 < str2
  32. res = str1.uppercaseString
  33. NSLog("大写字符串:%@", res) //输出:ABCDEFGHIJK
  34. res = str1.lowercaseString
  35. NSLog("小写字符串:%@", res) //输出:abcdefghijk
  36. NSLog("原始字符串: %@", str1) //输出:aBcDeFgHiJk
  37. //获得前三个数
  38. res = str1.substringToIndex(3)
  39. NSLog("字符串str1的前三个字符: %@",res)//输出:aBc
  40. res = str1.substringFromIndex(4)
  41. NSLog("截取字符串,从第索引4到尾部: %@",res)
  42. //输出:截取字符串,从第索引4到尾部: eFgHiJk
  43. var temp:NSString = str1.substringFromIndex(3)
  44. res = temp.substringToIndex(2)
  45. NSLog("截取字符串,从第索引3到5: %@",res)
  46. //截取字符串,从第索引3到5: De
  47. //字符串查找
  48. subRange = str2.rangeOfString("34")
  49. if subRange.location == NSNotFound {
  50. NSLog("字符串没有找到")
  51. } else {
  52. NSLog("找到的字符串索引 %i长度是 %i",
  53. subRange.location, subRange.length)
  54. }
  55. //输出:找到的字符串索引 13 长度是 2

上述代码也比较简单,我们择要解释一下。其中代码第①行是声明NSRange的变量subRangeNSRange是一个结构体,描述一个范围,它有两个成员location(位置)和length(长度)。

第②行代码是通过NSLog函数输出字符串str1的长度。在NSLog函数中可以格式化输出信息,如果要想输出整数,使用%i指定格式形式。

第③行代码是复制字符串到res变量,虽然NSString字符串类是不可变的,它可以重写构建其他的字符串对象,stringWithString方法是静态工厂方法。第④行代码是通过NSLog函数格式化字符串信息,使用%@指定格式形式。

第⑤行代码是复制字符串到str1尾部,stringByAppendingString方法可以拼接str1str2产生一个新的对象,然后把新对象的引用又赋值给str2

第⑥行代码substringToIndex(index)方法是从前往后截取字符串,截取前index个字符串。第⑦行代码substringFromIndex方法是从index位置截取字符串到尾部。如果想截取中间的字符串怎么办呢?第⑧行代码回答了这个问题,其实很简单,就是两个方法一起用。

字符串查找在字符串计算中也是经常使用的,其中代码第⑨行的subRange = str2.rangeOf String("34")方法,可以查找"34"字符串在str2字符串中的位置,其返回值subRangeNSRange类型。关于NSRange类型我们在前文已经解释了,其中第⑩行代码是判断是否找到了目标字符串,如果location成员值等于NSNotFound常量说明没有找到。NSNotFound是Foundation框架中定义的常量。

19.2.2 NSMutableString

NSMutableStringNSString的子类,有很多方法,下面总结常用的属性和方法。

  • +stringWithCapacity: 静态工厂创建方法NSMutableString对象。

  • -initWithCapacity: 构造器,通过指定容量构造NSMutableString对象,NSMutableString构造方法还有很多。

  • -insertString:atIndex: 插入字符串,不会创建新的对象。

  • -appendString: 追加字符串,不会创建新的对象。

  • -deleteCharactersInRange: 在一个范围内删除字符串,不会创建新的对象。

  • -replaceCharactersInRange:withString: 替换字符串,不会创建新的对象。

下面看NSMutableString字符串示例代码:

  1. import Foundation
  2. var str1 : NSString = "Objective C"
  3. var search, replace : NSString
  4. var mstr : NSMutableString
  5. var substr : NSRange
  6. //从不可变的字符创建可变字符串对象
  7. mstr = NSMutableString.stringWithString(str1)
  8. NSLog(" %@", mstr)
  9. //输出: Objective C
  10. //插入字符串
  11. mstr.insertString(" Java", atIndex : 9)
  12. NSLog(" %@", mstr)
  13. //输出: Objective Java C
  14. //具有连接效果的插入字符串
  15. mstr.insertString(" and C++", atIndex : mstr.length)
  16. NSLog(" %@", mstr)
  17. //输出: Objective Java C and C++
  18. //字符串连接方法
  19. mstr.appendString(" and C")
  20. NSLog(" %@", mstr)
  21. //输出: Objective Java C and C++ and C
  22. //使用NSRange删除字符串
  23. mstr.deleteCharactersInRange(NSMakeRange(16, 13))
  24. NSLog(" %@", mstr)
  25. //输出: Objective Java CC
  26. //查找字符串位置
  27. substr = mstr.rangeOfString("string B and")
  28. if substr.location != NSNotFound {
  29. mstr.deleteCharactersInRange(substr)
  30. NSLog(" %@", mstr)
  31. }
  32. //直接设置可变字符串
  33. mstr.setString("This is string A ")
  34. NSLog(" %@", mstr)
  35. //输出: This is string A
  36. mstr.replaceCharactersInRange(NSMakeRange(8, 8), withString: "a mutable string ")
  37. NSLog(" %@", mstr)
  38. //输出: This is a mutable string
  39. //查找和替换
  40. search = "This is "
  41. replace = "An example of "
  42. substr = mstr.rangeOfString(search)
  43. if substr.location != NSNotFound {
  44. mstr.replaceCharactersInRange(substr, withString: replace)
  45. NSLog(" %@", mstr)
  46. //输出: An example of a mutable string
  47. }
  48. //查找和替换所有的情况
  49. search = "a"
  50. replace = "X"
  51. substr = mstr.rangeOfString(search)
  52. while substr.location != NSNotFound {
  53. mstr.replaceCharactersInRange(substr, withString: replace)
  54. substr = mstr.rangeOfString(search)
  55. }
  56. NSLog(" %@", mstr)
  57. //输出: An exXmple of X mutXble string

上述代码第①行中使用NSMakeRange(16, 13)NSMakeRange是一个函数,可以创建NSRange结构体,第一个参数是位置,第二个参数是长度。第②行代码mstr.setString("This is string A ")是重新设置字符串。

19.2.3 NSStringString之间的关系

在Swift中,使用字符串有可能会使用Foundation中的NSString和Swift中的String。下面我们介绍一下它们之间的关系。Swift在底层能够将StringNSString无缝地桥接起来,String可调用 NSString的全部API。

因为可以在String中使用NSString,很多String API不具有的功能可以通过调用NSString API实现,但是有些时候类型转换是必要的。

下面我们看一个使用StringNSString的示例代码:

  1. import Foundation
  2. let foundationString : NSString = "alpha bravo charlie delta echo"
  3. let swiftString : String = foundationString
  4. let foundationString2 : NSString = swiftString
  5. let swiftArray : Array = swiftString.componentsSeparatedByString(" ")
  6. let intString : NSString = "456"
  7. let intValue = (intString as String).toInt()

要想使用NSString,需要引入Foundation或Cocoa。代码第①行是引入Foundation,第②行代码声明并初始化NSString字符串,第③行代码是将NSString字符串赋值给String字符串变量swiftString。在这个这个过程中,事实上发生了类型转换,但是我们不需要做任何事情。类似地,第④行代码是将String字符串赋值给NSString字符串,这个过程中也发生了类型转换。

第⑤行代码调用了NSStringcomponentsSeparatedByString方法,该方法可以使用指定的字符分割字符串返回数组,本来返回的数组是Foundation框架中的NSArray,但是本例中是Array,这个过程中发生了从NSArrayArray的类型转换,这个问题我们将在19.3节详细讨论。

第⑥行代码声明并初始化NSString字符串,它是由数字组成的字符串,这种字符串可以转换为数字类型。第⑦行代码使用StringtoInt方法进行转换,但是调用该方法需要String,因此需要使用as运算符将NSString强制类型转换为String。在大多数情况下,NSStringString之间不需要进行这种强制类型的转换。