对String的理解
String是一种快速的现代化的字符串实现。每一个字符串都是由与编码无关的Unicode字符组成。并支访问字符串的多种Unicode表现形式。String并不是一个字符数组,而是一个提供一个从多个维度展现一个Unicode视图的类型
PS:Unicode采用了可变长度编码方案,其中包含了两个意思。
第一个含义:编码单位codeunit的长度可变。比如人民币 ¥ 的表现方式:
¥:UTF-8 C2A5
¥:UTF-16 00A5
¥:UTF-32 000000A5
第二个含义:构成同一个单位的编码组合是可变的。比如定义Café时有如下两种方式
在这两种情况中,字母é代表了一个单一的 Swift 的Character值,同时代表了一个可扩展的字符群集。
在第一种情况,这个字符群集包含一个单一标量;而在第二种情况,它是包含两个标量的字符群集。可扩展的字符群集是一个灵活的方法,用许多复杂的脚本字符表示单一的Character值。
String的使用
1.计算字符数量
如果想要获得一个字符串中Character值的数量,可以使用字符串的characters属性的count属性:
注意:通过characters属性返回的字符数量并不总是与包含相同字符的NSString的length属性相同。NSString的length属性是利用UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。可扩展的字符群集可以组成一个或者多个Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift中的字符在一个字符串中并不一定占用相同的内存空间数量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量
2.字符串索引
每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置。使用startIndex属性可以获取一个String的第一个Character的索引。使用endIndex属性可以获取最后一个Character的后一个位置的索引。因此,endIndex属性不能作为一个字符串的有效下标。如果String是空串,startIndex和endIndex是相等的。通过调用String的index(before:)或index(after:)方法,可以立即得到前面或后面的一个索引。您还可以通过调用index(_:offsetBy:)方法来获取对应偏移量的索引,这种方式可以避免多次调用index(before:)或index(after:)方法。
注意:不同的字符可能会占用不同数量的内存空间,所以要知道Character的确定位置,就必须从String开头遍历每一个Unicode标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引。
但是试图获取越界索引对应的Character,将引发一个运行时错误。
使用characters属性的indices属性会创建一个包含全部索引的范围(Range),用来在一个字符串中访问单个字符。
3.插入替换和删除
调用insert(_:at:)方法可以在一个字符串的指定索引插入一个字符,调用insert(contentsOf:at:)方法可以在一个字符串的指定索引插入一个段字符串。
替换string中的某些字符:
调用remove(at:)方法可以在一个字符串的指定索引删除一个字符,调用removeSubrange(_:)方法可以在一个字符串的指定索引删除一个子字符串。
4.比较字符串
Swift提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
4.1字符串/字符相等
字符串/字符可以用等于操作符(==)和不等于操作符(!=),如果两个字符串(或者两个字符)的可扩展的字形群集是标准相等的,那就认为它们是相等的。在这个情况下,即使可扩展的字形群集是有不同的Unicode 标量构成的,只要它们有同样的语言意义和外观,就认为它们标准相等。
4.2前缀/后缀相等
通过调用字符串的hasPrefix(_:)/hasSuffix(_:)方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个String类型的参数,并返回一个布尔值。
5. 修改和读取字符串
读取字符串:prefix(_:)获取string的前缀suffix(_:)获取string的后缀index(of:)获取某个字符在string的索引
字符串截取,dropFirst(_:)截取钱index个字符dropLast(_:)截取后index个字符