注:本文为自己学习The Swift Programming Language的笔记,其中的例子为引用原书和其他博文或自己原创的。每个例子都会批注一些实践过程中的经验或思考总结。
1.基础
Swift支持String字符串类型和Charater字符类型来提供一个快速的、支持Unicode编码的方式来处理字符操作。Swift的String类型和Objective-C的NSString无缝接合,所有NSString的API对String同样适用。但是String变量总是可变长的,而在Objective-C中变长字符串是NSMutableString。
Swift字符串是传值类型,在传入函数参数或者赋值时,它是新建一个原来字符串的拷贝,而不是分配一个指针,新建字符串和原来的字符串并不储存在同一个空间。区别于Objective-C中NSString,后者是传址类型,即相当于一个指针。
Character字符类型同样用双引号把字符括起来,每一个字符代表一个独立的Unicode字符,字符串相当于Character的一个集合。
字符串和字符之间可以两两连接,使用最简单的运算符+,+=同样适用。
2.字符串字面值
字符串字面值[String Literals]指的是用两个双引号括起来的内容,我们可以使用字符串字面值给字符串常量或变量赋值。
字符串字面值中有以下几种特殊字符:
(1)专用特殊字符:\0 空字符,\\ 反斜杠,\t 制表符,\n 换行符,\r 回车符,\" 双引号,\' 单引号。
(2)单字节Unicode纯量,写作 \xnn,nn是两位十六进制数
(3)双字节Unicode纯量,写作 \unnnn,nnnn是四位十六进制数
(4)四字节Unicode纯量,写作 \Unnnnnnnn,nnnnnnnn是八位十六进制数
下面原书给出的例子来说明特殊字符用法,注意Swift的Character也是双引号表示:
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\x24" // $, Unicode scalar U+0024
let blackHeart = "\u2665" // ♥, Unicode scalar U+2665
let sparklingHeart = "\U0001F496" // [爱心符号], Unicode scalar U+1F496
3.初始化空字符串
Swift提供两种初始化空字符串的方法,一是空的两个双引号,而是调用String的无参数构造函数:var emptyString1 = ""
var emptyString2 = String()
检查字符串是否为空可以检查String的Bool类型属性isEmpty。
4.字符计数
Swift提供标准全局函数countElements来完成字符的计数,返回一个Int类型值。
由于不同的Unicode字符和同一Unicode不同的表示方式会占用不同的内存,countElements在进行字符计数时需要迭代计算整个字符串获取准确字符数,而不是简单根据空间大小计数。因而对长字符串的字符计数在使用该函数的时候要特别注意,可能会消耗一点时间。
5.字符串插入
用\( )符号可以将常量、变量、字符串字面值和表达式(完成计算后)插入到字符串中,这个方法前面已经使用很多次了,比C语言系列的格式化字符串要方便许多。
6.字符串比较
Swift提供三种字符串比较方式:字符串相等、前缀相等和后缀相等。
(1)字符串相等:==等号运算符实现,返回true时当仅当两个字符串完全一致。
(2)前缀相等,后缀相等:Swift字符串有hasPrefix()和hasSuffix()两个方法提供前缀相等和后缀相等判断方法,传入参数为查询前后缀,返回值为Bool类型。
let studentID = "PB12210134"
if studentID.hasPrefix("PB") {
println("He or She is an undergraduate student.")
}
6.大写和小写字符串
Swift字符串有uppercaseString和lowercaseString属性分别存储String的大写形式和小写形式。
7.Unicode
Unicode是一种国际标准化的编码和文字表示,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Swift的String类型和Character类型都是Unicode编码的。
每一个Unicode的字符可以被一个或多个不同的Unicode纯量[Scalar]表示,Unicode纯量是一个特殊的21位数。Unicode字符串在存储时,对应的Unicode纯量根据不同的Unicode编码格式以叫做code unit的小单元编码,编码格式包括UTF-8(code unit是8位的)和UTF-16(code unit是16位的)等。
Swift的String提供相应属性获取一个字符串的Unicode编码:
(1)UTF-8:String的utf8属性
(2)UTF-16:String的utf8属性
(3)Unicode纯量:String的unicodeScalars属性
下面给出一个表情字符:DOG FACE的例子来反应三种形式的Unicode:
let dog = "Dog:[DOG FACE]"
for codeUnit in dog.utf8 {
print("\(codeUnit) ")
}
println()
for codeUnit in dog.utf16 {
print("\(codeUnit) ")
}
println()
for scalar in dog.unicodeScalars {
print("\(scalar.value) ")
}
println()
/*prints
68 111 103 58 240 159 144 182
68 111 103 58 55357 56374
68 111 103 58 128054 */
可以看到每个UTF-8的codeunit最大不超过UInt8.max,每个UTF-16的codeunit最大不超过UInt16.max。