19.2 字符串类
在Foundation框架中,字符串类有两种:不可变字符串类NSString
和可变字符串类NSMutableString
。NSString
是定义固定大小的字符串,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
字符串示例代码:
var str1 : NSString = "aBcDeFgHiJk"
var str2 : NSString = "12345"
var res : NSString
var compareResult : NSComparisonResult
var subRange : NSRange ①
//字符个数
NSLog("字符串str1长度: %i",str1.length) //输出:11 ②
//复制字符串到res
res = NSString.stringWithString(str1) ③
NSLog("复制: %@", res) //输出:aBcDeFgHiJk ④
//复制字符串到str1尾部
str2 = str1.stringByAppendingString(str2) ⑤
NSLog("连接字符串: %@", str2) //输出:aBcDeFgHiJk12345
//测试字符串相等
if str1.isEqualToString(res) == true {
NSLog("str1 == res")
} else {
NSLog("str1 != res")
}
//输出:str1 == res
//测试字符串<> ==
compareResult = str1.compare(str2)
switch compareResult {
case .OrderedAscending:
NSLog("str1 < str2")
case .OrderedSame:
NSLog("str1 == str2")
Default:
NSLog("str1 > str2")
}
//输出:str1 < str2
res = str1.uppercaseString
NSLog("大写字符串:%@", res) //输出:ABCDEFGHIJK
res = str1.lowercaseString
NSLog("小写字符串:%@", res) //输出:abcdefghijk
NSLog("原始字符串: %@", str1) //输出:aBcDeFgHiJk
//获得前三个数
res = str1.substringToIndex(3) ⑥
NSLog("字符串str1的前三个字符: %@",res)//输出:aBc
res = str1.substringFromIndex(4)
NSLog("截取字符串,从第索引4到尾部: %@",res) ⑦
//输出:截取字符串,从第索引4到尾部: eFgHiJk
var temp:NSString = str1.substringFromIndex(3)
res = temp.substringToIndex(2) ⑧
NSLog("截取字符串,从第索引3到5: %@",res)
//截取字符串,从第索引3到5: De
//字符串查找
subRange = str2.rangeOfString("34") ⑨
if subRange.location == NSNotFound { ⑩
NSLog("字符串没有找到")
} else {
NSLog("找到的字符串索引 %i长度是 %i",
subRange.location, subRange.length) ⑪
}
//输出:找到的字符串索引 13 长度是 2
上述代码也比较简单,我们择要解释一下。其中代码第①行是声明NSRange
的变量subRange
。NSRange
是一个结构体,描述一个范围,它有两个成员location
(位置)和length
(长度)。
第②行代码是通过NSLog
函数输出字符串str1
的长度。在NSLog
函数中可以格式化输出信息,如果要想输出整数,使用%i
指定格式形式。
第③行代码是复制字符串到res
变量,虽然NSString
字符串类是不可变的,它可以重写构建其他的字符串对象,stringWithString
方法是静态工厂方法。第④行代码是通过NSLog
函数格式化字符串信息,使用%@
指定格式形式。
第⑤行代码是复制字符串到str1
尾部,stringByAppendingString
方法可以拼接str1
和str2
产生一个新的对象,然后把新对象的引用又赋值给str2
。
第⑥行代码substringToIndex(index)
方法是从前往后截取字符串,截取前index
个字符串。第⑦行代码substringFromIndex
方法是从index
位置截取字符串到尾部。如果想截取中间的字符串怎么办呢?第⑧行代码回答了这个问题,其实很简单,就是两个方法一起用。
字符串查找在字符串计算中也是经常使用的,其中代码第⑨行的subRange = str2.rangeOf String("34")
方法,可以查找"34"
字符串在str2
字符串中的位置,其返回值subRange
是NSRange
类型。关于NSRange
类型我们在前文已经解释了,其中第⑩行代码是判断是否找到了目标字符串,如果location
成员值等于NSNotFound
常量说明没有找到。NSNotFound
是Foundation框架中定义的常量。
19.2.2 NSMutableString
类
NSMutableString
是NSString
的子类,有很多方法,下面总结常用的属性和方法。
+stringWithCapacity:
静态工厂创建方法NSMutableString
对象。-initWithCapacity:
构造器,通过指定容量构造NSMutableString
对象,NSMutableString
构造方法还有很多。-insertString:atIndex:
插入字符串,不会创建新的对象。-appendString:
追加字符串,不会创建新的对象。-deleteCharactersInRange:
在一个范围内删除字符串,不会创建新的对象。-replaceCharactersInRange:withString:
替换字符串,不会创建新的对象。
下面看NSMutableString
字符串示例代码:
import Foundation
var str1 : NSString = "Objective C"
var search, replace : NSString
var mstr : NSMutableString
var substr : NSRange
//从不可变的字符创建可变字符串对象
mstr = NSMutableString.stringWithString(str1)
NSLog(" %@", mstr)
//输出: Objective C
//插入字符串
mstr.insertString(" Java", atIndex : 9)
NSLog(" %@", mstr)
//输出: Objective Java C
//具有连接效果的插入字符串
mstr.insertString(" and C++", atIndex : mstr.length)
NSLog(" %@", mstr)
//输出: Objective Java C and C++
//字符串连接方法
mstr.appendString(" and C")
NSLog(" %@", mstr)
//输出: Objective Java C and C++ and C
//使用NSRange删除字符串
mstr.deleteCharactersInRange(NSMakeRange(16, 13)) ①
NSLog(" %@", mstr)
//输出: Objective Java CC
//查找字符串位置
substr = mstr.rangeOfString("string B and")
if substr.location != NSNotFound {
mstr.deleteCharactersInRange(substr)
NSLog(" %@", mstr)
}
//直接设置可变字符串
mstr.setString("This is string A ") ②
NSLog(" %@", mstr)
//输出: This is string A
mstr.replaceCharactersInRange(NSMakeRange(8, 8), withString: "a mutable string ")
NSLog(" %@", mstr)
//输出: This is a mutable string
//查找和替换
search = "This is "
replace = "An example of "
substr = mstr.rangeOfString(search)
if substr.location != NSNotFound {
mstr.replaceCharactersInRange(substr, withString: replace)
NSLog(" %@", mstr)
//输出: An example of a mutable string
}
//查找和替换所有的情况
search = "a"
replace = "X"
substr = mstr.rangeOfString(search)
while substr.location != NSNotFound {
mstr.replaceCharactersInRange(substr, withString: replace)
substr = mstr.rangeOfString(search)
}
NSLog(" %@", mstr)
//输出: An exXmple of X mutXble string
上述代码第①行中使用NSMakeRange(16, 13)
,NSMakeRange
是一个函数,可以创建NSRange
结构体,第一个参数是位置,第二个参数是长度。第②行代码mstr.setString("This is string A ")
是重新设置字符串。
19.2.3 NSString
与String
之间的关系
在Swift中,使用字符串有可能会使用Foundation中的NSString
和Swift中的String
。下面我们介绍一下它们之间的关系。Swift在底层能够将String
与NSString
无缝地桥接起来,String
可调用 NSString
的全部API。
因为可以在String
中使用NSString
,很多String API
不具有的功能可以通过调用NSString
API实现,但是有些时候类型转换是必要的。
下面我们看一个使用String
和NSString
的示例代码:
import Foundation ①
let foundationString : NSString = "alpha bravo charlie delta echo" ②
let swiftString : String = foundationString ③
let foundationString2 : NSString = swiftString ④
let swiftArray : Array = swiftString.componentsSeparatedByString(" ") ⑤
let intString : NSString = "456" ⑥
let intValue = (intString as String).toInt() ⑦
要想使用NSString
,需要引入Foundation或Cocoa。代码第①行是引入Foundation,第②行代码声明并初始化NSString
字符串,第③行代码是将NSString
字符串赋值给String
字符串变量swiftString
。在这个这个过程中,事实上发生了类型转换,但是我们不需要做任何事情。类似地,第④行代码是将String
字符串赋值给NSString
字符串,这个过程中也发生了类型转换。
第⑤行代码调用了NSString
的componentsSeparatedByString
方法,该方法可以使用指定的字符分割字符串返回数组,本来返回的数组是Foundation框架中的NSArray
,但是本例中是Array
,这个过程中发生了从NSArray
到Array
的类型转换,这个问题我们将在19.3节详细讨论。
第⑥行代码声明并初始化NSString
字符串,它是由数字组成的字符串,这种字符串可以转换为数字类型。第⑦行代码使用String
的toInt
方法进行转换,但是调用该方法需要String
,因此需要使用as
运算符将NSString
强制类型转换为String
。在大多数情况下,NSString
和String
之间不需要进行这种强制类型的转换。