作者:Aaron Dean,日期:2020.04.23

Image by Anja from Pixabay

本文主角:字符串

问题1:什么是字符串?

字符串(string)即一串字符序列,比如“嗨,好久不见”。

Swift中的字符串用 String类型表示,String类型是值类型(value type),即声明后在任何地方使用一个字符串,都会创建现有String值的新副本,除非你自己修改,否则不会改变所传递的字符串。

一个playground 文件新建完成后,代码编辑区的第二行代码就定义了一个名为 str 的字符串变量,并获得了初始值”Hello, playground”。

问题 2:怎么定义单行或多行字符串?

使用双引号(””),将预定义的字符串值作为字符串字面量(String Literals)赋给一个常量或变量。如果你的字符串需要跨越多行,请使用三引号(three double quotation marks)。

问题3:字符串中可以有哪些特殊字符?

字符串中使用转义字符包含的特殊字符有空字符、反斜杆、水平制表符、换行符、回车、双引号、单引号,以及任意Unicode标量值(写为\ u{ n} ,其中n是1–8位数的十六进制数))。

如果你想输出三引号(three double quotation marks),需要这样写:

问题 4:空字符串有什么用?

可以创建一个空的String值作为构建更长字符串的起点。

问题5:如何访问字符串的单个字符?

使用 for – in 循环。

问题6:如何连接字符串和字符?

使用“ +” 运算符连接两个字符串,使用“+=”运算符给已经存在的字符串变量追加新字符串,也可以使用 append( )方法给一个字符串追加新字符串或字符。

那如果是多行字符串,要想再优雅地加上一行或几行,怎么办呢?示例如下:

问题7:字符串插值是什么?一个字符串里有多少个字符?

字符串插值(string interpolation)是通过将常量,变量,文字和表达式的值包含在字符串文字中来构造新的String值的方法。看看示例,你就明白了:

使用 count 属性计算一个字符串含有的字符数,是否使用扩展字符集不影响计数。

问题8:如何访问和修改字符串?

通过字符串的方法和属性,或者使用下标语法(subscript syntax)访问和修改字符串。遵循 Collection 协议的的任何类型(String、Array、 Dictionary,和Set),都可以使用 startIndexendIndex 属性与 index(before: )Index(after: )index(_:offsetBy: ) 方法。具体如下:

  • 字符串索引(String Indices)

每一个字符串值都有一个相关联的索引类型String.Index,对应着字符串中每个字符的位置。不同字符所需的内存不同,因此,为了确定特定位置的字符,你必须从该字符串的开头或末尾迭代每一个 Unicode 标量值。也正因为这样,Swift 的字符串不能通过整数值索引。

使用 startIndex 属性访问字符串的第一个字符,endIndex 属性表示字符串中最后一个字符之后的位置。 因此,endIndex属性不是字符串下标的有效参数。 如果String为空,则startIndex和endIndex相等。

使用字符串 的 index(before: ) index(after: ) 方法访问在给定索引之前和之后的索引,使用index(_:offsetBy: ) 方法 访问距离给定索引某个距离的索引。你可以使用下标语法在特定的字符串索引处访问相应的字符。

使用 indices 属性可访问字符串中各个字符的所有索引。

  • 插入和删除(Inserting and Removing)

使用 insert(_:at: ) 方法将单个字符插入到指定位置,或使用 insert(contentsOf:at:) 方法向指定位置插入另外的字符串文本。与之对应,使用 remove(at: )方法从字符串的特定位置删除一个字符,使用 removeSubrange(_: ) 方法从字符串特定的几个连续的位置移除一个子字符串。

问题 9:什么是子字符串?

子字符串见下图。当你使用下标或者 prefix(_: ) 之类的方法从一个字符串获得子字符串时,结果是Substring的实例。你可以像处理字符串一样使用子字符串,并且它们都遵循 StringProtocol 协议。但字符串和子字符串有一个很大的区别,即为了性能优化,子字符串可以重用用于存储原始字符串的部分内存或用于存储另一个子字符串的部分内存。这就造成了子字符串不适合长期存储,当所以你准备长时间存储结果时,需要将子字符串转换为String的实例。

🔼图源 | Swift —Strings and Characters

示例代码:

问题10:怎么比较两个字符串?

Swift提供了三种方法:字符串和字符相等(使用 == != 进行条件判断)、前缀相等(使用 hasPrefix(_: )方法)和后缀相等(使用 hasSuffix(_: )方法)。


补充:了解Unicode

Unicode(国际码):用于在不同书写系统中编码,表示和处理文本的国际标准。 它使你能够以标准化的形式表示来自任何语言的几乎所有字符,并能够与诸如文本文件或网页之类的外部源进行读写。

Unicode 标量值(Unicode Scalar Values) :Swift的String和Character类型完全符合Unicode。 Swift 的原生 String 类型是根据Unicode 标量值构建的。Unicode 标量值就是表示字符或修饰符的21位数字(唯一),但并非所有21位Unicode标量值都分配给一个字符-一些标量保留用于将来分配或用于UTF-16编码。 通常,已分配给字符的标量值也具有名称。比如U+0061代表 小写字母 a(LATIN SMALL LETTER A )、U+1F425代表前脸小鸡(FRONT-FACING BABY)(”🐥”):

扩展字符集(Extended Grapheme Clusters):Swift的Character类型的每个实例都代表一个扩展字符集。 扩展字符集是一个或多个Unicode标量的序列,这些标量(组合时)产生一个人类可读的字符。示例:

本文在简书鱼乐自学(网站)、微信公众号(扫描二维码)同步更新,欢迎访问。如果本文对你有用,欢迎收藏、赞赏或转发分享,转载及其他用途等请遵循CC BY 4.0协议


参考资料:Swift —Strings and Characters

文档协议:CC-BY-4.0(共享-演绎-署名-不附加限制)