处理字符串的难点是字符串的索引和创建字符串等其他的问题以及如何创建一个字符串的子串。
字符串是由Unicode组成的,你不要把Unicode组成的字符串的子串看做Unicode字符,而是把它们拆分成Unicode字素,所以我们不能像数组中那样索引,因为会遇到有的字素是由多个字符组成,这样会把一个完整语义的字素拆成了两个字符从而改变了原意。所以字符串是由另外的一个类型来索引的,这种类型就是String.index。注意advance这是个函数,并不是方法,它会跳过整个字素而不是一个字符。如示例中所示index会输出“l”。
另外字符串中的splice和数组中的splice很像,将一个字符串合并到另一个字符串当中。示例中s的值现在变成了heabcllo。
最后我们使用range可以得到s的子串,在截取起始终止位置的时候不能直接用Int,依旧必须采用advance的办法,如示例中最后截取的子串为eabcl。
还记得之前在计算器项目中使用的rangeOfString方法么,它会返回一个Optional类型的Range。我们可以利用整个方法来获取字符串中的子串,比如第一个示例获取一个浮点数的小数部分。或者把这部分替换或者删除,但前提都是获取你需要的range。
String还有些其他的方法,都是基于字符串的索引的,有我们之前见过的description、join方法。值得注意的是字符串操作中只有toInt而没有toDouble,因为Double的结构比较复杂,你需要指定一些细节诸如小数点后面有多少位等等,需要额外的参数。但是Int就不存在,当然toInt的返回值是可选型,如果你让“hello”调用toInt,那么很明显会返回一个nil。
还有一些通过初始化实现类型转换的方法。比较有趣的是你可以通过初始化方法实现数组和字符串的互转,不过要注意转换后的数组的元素是字符串中的Unicode字符。
我们也可以通过\()调用的方法把浮点数转换成字符串。
最后再讲一个debug相关的方法。Assertions
assert这个方法接受一个闭包作为其第一个参数,第二个参数是一个字符串,加入第一个闭包返回的是一个false,那么这个字符串就会被打印到中控台上。
如示例中我们希望某个函数不为空,如果为空会把程序搞崩溃,使用assert,当这个函数为空的时候,会把后面的字符串打印到中控台,这样你就知道哪里出问题了。