1.序言
Swift 的String 和Character 类型提供了快速和兼容 Unicode 的方式供你的代码使用。你也可以在字符串内插过程中使用字符串插入常量、变量、字面量表达成更长的字符串,这样可以很容易的创建自定义的字符串值,进行展示、存储以及打印。
注意:Swift 的String 类型与 Foundation NSString 类进行了无缝桥。
Foundation 也可以对String 进行扩展,暴露在NSString 中定义的方法。 这意味着,如果你在String 中调用这些NSString 的方法,将不用进行转换。
2.初始化空字符串
要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的String 实例:
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
// 两个字符串均为空并等价。
2.1字符串可变性
您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
2.2字符串是值类型
Swift 的String 类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
注意:Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。 很明显无论该值来自于哪里,都是您
独自拥有的。 您可以确信传递的字符串不会被修改,除非你自己去修改它。
2.3连接字符串和字符
字符串可以通过加法运算符( + )相加在一起(或称“连接”)创建一个新的字符串:
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome 现在等于 "hello there"
您也可以通过加法赋值运算符 ( += ) 将一个字符串添加到一个已经存在字符串变量上:
var instruction = "look over"
instruction += string2
// instruction 现在等于 "look over there"
您可以用append() 方法将一个字符附加到一个字符串变量的尾部:
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome 现在等于 "hello there!"
注意:
您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。
2.4字符串插值
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中
注意:
插值字符串中写在括号中的表达式不能包含非转义反斜杠 ( \ ),并且不能包含回车或换行符。不过,插值字符串可以包含其他字面量。
注意:
可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间数
量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意characters 属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量。
另外需要注意的是通过characters 属性返回的字符数量并不总是与包含相同字符的NSString 的length 属性相同。NSString 的length 属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群
集。作为佐证,当一个NSString 的length 属性被一个Swift的String 值访问时,实际上是调用了utf16Count 。
2.5访问和修改字符串
2.5.1访问和修改字符串
你可以通过字符串的属性和方法来访问和修改它,当然也可以用下标语法完成。
字符串索引
每一个String 值都有一个关联的索引(index)类型, String.Index ,它对应着字符串中的每一个Character 的位置。
2.5.2插入和删除
调用insert(_:at:) 方法可以在一个字符串的指定索引插入一个字符,调用insert(contentsOf:at:) 方法可以在一个字符串的指定索引插入一个段字符串。
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"
welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello there!"
调用remove(at:) 方法可以在一个字符串的指定索引删除一个字符,调用removeSubrange(_:) 方法可以在一个字符串的指定索引删除一个子字符串。
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello there"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello"
2.5比较字符串
字符串/字符相等
et quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
print("These two strings are considered equal")
}
// 打印输出 "These two strings are considered equal"
前缀/后缀相等
通过调用字符串的hasPrefix(_:) / hasSuffix(_:) 方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个String 类型的参数,并返回一个布尔值。
注意:
hasPrefix(_:) 和hasSuffix(_:) 方法都是在每个字符串中逐字符比较其可扩展的字符群集是否标准相等。