2.0 翻译+校对:DianQK
本页包含内容:
- 字符串字面量(String Literals)
- 初始化空字符串 (Initializing an Empty String)
- 字符串可变性 (String Mutability)
- 字符串是值类型(Strings Are Value Types)
- 使用字符(Working with Characters)
- 连接字符串和字符 (Concatenating Strings and Characters)
- 字符串插值 (String Interpolation)
- Unicode
- 计算字符数量 (Counting Characters)
- 访问和修改字符串 (Accessing and Modifying a String)
- 比较字符串 (Comparing Strings)
- 字符串的 Unicode 表示形式(Unicode Representations of Strings)
String
是例如"hello, world","albatross"这样的有序的Character
(字符)类型的值的集合,通过String
类型来表示。 Swift 的String
和Character
类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本。 创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。 字符串连接操作只需要简单地通过+
符号将两个字符串相连即可。 与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。 尽管语法简易,但String
类型是一种快速、现代化的字符串实现。 每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式(representations)。 你也可以在常量、变量、字面量和表达式中进行字符串插值操作,这可以帮助你轻松创建用于展示、存储和打印的自定义字符串。
注意:
Swift 的String
类型与 FoundationNSString
类进行了无缝桥接。就像AnyObject
类型 中提到的一样,在使用 Cocoa 中的 Foundation 框架时,您可以将创建的任何字符串的值转换成NSString
,并调用任意的NSString
API。您也可以在任意要求传入NSString
实例作为参数的 API 中用String
类型的值代替。 更多关于在 Foundation 和 Cocoa 中使用String
的信息请查看 _Using Swift with Cocoa and Objective-C_。
字符串字面量(String Literals)
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号 ("") 包裹着的具有固定顺序的文本字符集。 字符串字面量可以用于为常量和变量提供初始值:
let someString = "Some string literal value"
注意someString
常量通过字符串字面量进行初始化,Swift 会推断该常量为String
类型。
注意: 更多关于在字面量的特殊字符,请查看 Special Characters in String Literals 。
初始化空字符串 (Initializing an Empty String)
要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的String
实例:
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
// 两个字符串均为空并等价。
您可以通过检查其Boolean
类型的isEmpty
属性来判断该字符串是否为空:
if emptyString.isEmpty {
print("Nothing to see here")
}
// 打印输出:"Nothing to see here"
字符串可变性 (String Mutability)
您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
var variableString = "Horse"
variableString += " and carriage"
// variableString 现在为 "Horse and carriage"
let constantString = "Highlander"
constantString += " and another Highlander"
// 这会报告一个编译错误 (compile-time error) - 常量不可以被修改。
注意: 在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(
NSString
和NSMutableString
)来指定该字符串是否可以被修改。
字符串是值类型(Strings Are Value Types)
Swift 的String
类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。 值类型在 结构体和枚举是值类型 中进行了详细描述。
注意:
与 Cocoa 中的NSString
不同,当您在 Cocoa 中创建了一个NSString
实例,并将其传递给一个函数/方法,或者赋值给一个变量,您传递或赋值的是该NSString
实例的一个引用,除非您特别要求进行值拷贝,否则字符串不会生成新的副本来进行赋值操作。
Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。 很明显无论该值来自于哪里,都是您独自拥有的。 您可以放心您传递的字符串本身不会被更改。
在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能。
使用字符(Working with Characters)
您可通过for-in
循环来遍历字符串中的characters
属性来获取每一个字符的值:
for character in "Dog!?" {
print(character)
}
// D
// o
// g
// !
// ?
for-in 循环在 For Loops 中进行了详细描述。
另外,通过标明一个Character
类型并用字符字面量进行赋值,可以建立一个独立的字符常量或变量:
let exclamationMark: Character = "!"
字符串可以通过传递一个值类型为Character
的数组作为自变量来初始化:
let catCharacters: [Character] = ["C", "a", "t", "!", "?"]
let catString = String(catCharacters)
print(catString)
// 打印输出:"Cat!?"
连接字符串和字符 (Concatenating Strings and Characters)
字符串可以通过加法运算符(+
)相加在一起(或称“连接”)创建一个新的字符串:
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!"
注意:
您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。
字符串插值 (String Interpolation)
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
let multiplier = 3
let message = "(multiplier) times 2.5 is (Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"
在上面的例子中,multiplier
作为(multiplier)
被插入到一个字符串字面量中。 当创建字符串执行插值计算时此占位符会被替换为multiplier
实际的值。
multiplier
的值也作为字符串中后面表达式的一部分。 该表达式计算Double(multiplier) * 2.5
的值并将结果 (7.5) 插入到字符串中。 在这个例子中,表达式写为(Double(multiplier) * 2.5)
并包含在字符串字面量中。
注意:
插值字符串中写在括号中的表达式不能包含非转义双引号 ("
) 和反斜杠 (),并且不能包含回车或换行符。
Unicode
Unicode 是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。 Swift 的字符串和字符类型是完全兼容 Unicode 标准的。
Unicode 标量(Unicode Scalars)
Swift 的String
类型是基于 Unicode 标量 建立的。 Unicode 标量是对应字符的唯一21位数字或者修饰符,例如U+0061
表示小写的拉丁字母(LATIN SMALL LETTER A
)("a
"),U+1F425
表示小鸡表情(FRONT-FACING BABY CHICK
) ("?
")
注意: Unicode 码位(code poing) 的范围是
U+0000
到U+D7FF
或者U+E000
到U+10FFFF
。Unicode 标量不包括 Unicode 代理项(surrogate pair) 码位,其码位范围是U+D800
到U+DFFF
。
注意不是所有的21位 Unicode 标量都代表一个字符,因为有一些标量是保留给未来分配的。已经代表一个典型字符的标量都有自己的名字,例如上面例子中的LATIN SMALL LETTER A
和FRONT-FACING BABY CHICK
。
字符串字面量的特殊字符 (Special Characters in String Literals)
字符串字面量可以包含以下特殊字符:
- 转义字符