Swift--String 详解

概述:

String是由一系列的字符(Character)组成的,可以看作是字符集合(Collection)。String与OC中的NSString相桥接(注意:NSString是引用类型,String是值类型),可以在使用了字符串的C函数里使用。

字符串的创建:

可以通过字面值或者字符串插值来创建

字符串的创建

字符串的连接:

使用 ‘+’ 连接两个字符串

字符串的连接

使用多行字符串(注意:第一个“”“后面和最后一个”“”前面的换行符是默认忽略的,如果要输出空行需要显示地输入空的行

多行字符串

字符串的修改和比较:

如需修改字符串,需要用变量声明一个字符串类型(var text:String = “......”),如果用let声明,则表示该字符串不能被修改。

使用相等运算符“==”进行字符串的比较

注意:字符串是通过Unicode的规范表示来进行比较的,即一个字符的Unicode表示可能不唯一,但只要这不同表示的语义是一样的,就认为不同的Unicode表示是等价的

字符串比较

String对语言环境的设置是不敏感的,而是根据Unicode的规范表示来确保String的正确性,这使得String可以被高效率地使用,在不同的语言环境下进行字符串比较都可以确保得到唯一的结果。

访问String中的元素:

String的组成:字符串 <- 字符集合 <- 扩展字素簇

扩展字素簇指的是Unicode标量的集合,一个扩展字素簇表示一个字符,不同的扩展字素簇可以表示同一个字符(Unicode标量是通过Unicode的边界算法整合成扩展字素簇的)

所以遍历String指的是访问String中的每一个字符(Character)

字符串的遍历

.firstIndex表示第一个位置的索引号,.endIndex表示最后一个位置的索引号(最后一个字符的下一个位置)

·someText.firstIndex(of:)可以返回第一个相应的字面值所在的索引号

·someText[..<index]通过数组的访问形式返回子字符串

访问String的Unicode表示:

String可以通过不同的Unicode编码方式进行编码,例如UTF-8,UTF-16,Unicode标量。使用不同的编码方式进行编码的字符串都可以看作是一系列的编码单元的集合(编码单元——n位的二进制序列)。

Unicode标量(等价于UTF-32):

.unicodeScalars 返回Unicode标量的编码单元集合,表示一个21位的二进制数(在Swift中用通过UInt32来表示)

.utf16 返回UTF-16的编码单元集合,每个编码单元表示一个16位的二进制数

·utf8 返回UTF-8的编码单元集合,每个编码单元表示一个8位的二进制数(String传递给C的API的时候使用UTF-8的编码形式)

计算字符串的长度:

1、计算字符的总数:

.count 返回字符串中包含的字符的个数

2、计算不同的编码格式下所占的编码单元的总数

.unicodeScalars.count 返回采用Unicode标量表示的字符串所占的编码单元的数量

.utf16.count 返回采用UTF-16表示的字符串所占的编码单元的数量

.utf8.count 返回采用UTF-8表示的字符串所占的编码单元的数量

计算字符串的长度或所占的编码单元长度

.isEmpty 判断字符串是否为空(不要用.count == 0,因为.count需要遍历字符串,需要花费额外的时间

访问字符串的Unicode编码单元:

String中某个字符和这个字符对应的Unicode编码单元是共享索引号的(编码单元的起始索引号)

访问字符串的编码单元

获取不同编码形式下编码单元的索引号

获取编码单元的索引号

当在字符串中使用某一编码单元的索引号时,此时的索引号表示的是字符串中字符的索引号(下方例子中,因为第二个索引位置不存在字符,所以该位置表示的还是flag本身)

使用编码单元的索引号访问字符串

如果需要检查编码单元的索引号所对于的位置是否存在字符,用.samePosition(in:)方法

检查索引号对应的位置是否存在字符

性能优化:

尽管String是值类型,Swift采用Copy-On-Write(COW)的策略对String的存储进行了优化。COW指的是Swift将某一String存储在缓存区中,该String的多个副本通过共享该缓冲区来访问String,只有当某个副本的值被修改时,才会发生复制的行为(开辟新的缓存区来存储该副本所对应的新值)。所以第一个修改String的值的操作的时间复杂度和空间复杂度可以是O(n)。

当一个String的连续存储空间满了的时候,必须为该字符串分配新的缓冲区并将数据转移到新的缓存区。Swift使用指数增长策略开辟缓存区。

String 与 NSString 的桥接:

使用类型转换运算符 as 实现String到NSString的桥接

Swift在底层能够将String与NSString无缝地桥接起来,然后String可以调用NSString中全部的API,丰富了String的功能。

String为值类型(Structure),而NSString为引用类型,所以使用String的效率会更高。在OC中使用String时,OC可能会使用NSString作为String的存储,所以并不能保证该场景下String的使用效率。


参考文献:

苹果官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容