type
status
date
slug
summary
tags
category
icon
password
example-row
example-row
Swift 的
String
和 Character
类型提供了一种快速且兼容 Unicode 的方式来处理代码中的文本内容。通过 +
符号实现两个字符串的拼接操作。能否更改字符串的值,取决于其被定义为常量还是变量。字符串字面量
- 普通字符串是一对双引号包裹的具有固定顺序的字符集。
- 多行字符串由一对三个双引号包裹着的具有固定顺序的文本字符集。
- 转义字符表示:
\0
(空字符)、\\
(反斜线)、(水平制表符)、(换行符)、(回车符)、\"
(双引号)、\'
(单引号)。
- Unicode 标量:写成
\u{n}
(u 为小写),其中n
为任意一到八位十六进制数且可用的 Unicode 位码。
- 字符串放在引号(
"
)中并用数字符号(#
)括起来,特殊字符将会被直接包含而非转义后的效果。
- 如果需要字符串文字中字符的特殊效果,请匹配转义字符(
\
)后面添加与起始位置个数相匹配的#
符。
打印效果:
使用字符
可以通过
for-in
循环来遍历字符串,获取字符串中每一个字符的值:可以通过标明一个
Character
类型并用字符字面量进行赋值, 建立一个独立的字符常量或变量:可以通过传递一个值类型为
Character
的数组作为自变量来初始化:连接字符串和字符
字符串可以通过加法运算符(
+
)相加在一起(或称“连接”)创建一个新的字符串,也可以通过加法赋值运算符(+=
)将一个字符串添加到一个已经存在字符串变量上,也可以用 append()
方法将一个字符或字符串添加到一个字符串变量的尾部。注意:不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。
字符串插值
在上面的例子中,
multiplier
作为 \(multiplier)
被插入到一个字符串常量量中。当创建字符串执行插值计算时此占位符会被替换为 multiplier
实际的值。如果要在使用扩展字符串分隔符的字符串中使用字符串插值,则需要在反斜杠后面添加与开头和结尾数量相同扩展字符串分隔符。
注意:插值字符串中写在括号中的表达式不能包含非转义反斜杠(
\
),并且不能包含回车或换行符。计算字符数量
使用字符串的
count
属性,获取一个字符串中 Character
值的数量。在 Swift 中,使用可拓展的字符群集作为 Character
值来连接或改变字符串时,并不一定会更改字符串的字符数量。访问和修改字符串
可以通过字符串的属性和方法来访问和修改它,也可以用下标语法访问和修改。
字符串索引
String.Index
,对应着字符串中的每一个Character
的位置。
- 不同的字符可能会占用不同数量的内存空间,所以要知道
Character
的确定位置,就必须从String
开头遍历每一个 Unicode 标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引
String.startIndex
属性可以获取一个String
的第一个Character
的索引。
String.endIndex
属性可以获取一个String
的最后一个Character
的后一个位置的索引。因此,endIndex
属性不能作为一个字符串的有效下标。如果String
是空串,startIndex
和endIndex
是相等的。
String
的index(before:)
方法获取指定索引的前面的一个索引。
String
的index(after:)
方法获取指定索引的后面的一个索引。
String
的index(_:offsetBy:)
方法获取对应偏移量的索引。
indices
属性会创建一个包含全部索引的范围(Range
),用来在一个字符串中访问单个字符。
插入和删除
insert(_:at:)
:在一个字符串的指定索引插入一个字符。
insert(contentsOf:at:)
:在一个字符串的指定索引插入一段字符串。
remove(at:)
:在一个字符串的指定索引删除一个字符。
removeSubrange(_:)
:在一个字符串的指定索引删除一个子字符串。
子字符串(Substring
)
- 使用下标或者
prefix(_:)
之类的方法可以得到一个Substring
的实例,而非另外一个String
。
- Swift 里的
Substring
绝大部分函数都跟String
一样,可以使用同样的方式去操作Substring
和String
。
- 在短时间内需要操作字符串时,才会使用
Substring
,当需要长时间保存结果时,就需要把Substring
转化为String
的实例。
String
和Substring
的区别在于性能优化上,Substring
可以重用原String
的内存空间,或者另一个Substring
的内存空间。
上面的例子,
greeting
是一个 String
,意味着它在内存里有一片空间保存字符集。而由于 beginning
是 greeting
的 Substring
,它重用了 greeting
的内存空间。相反,newString
是一个 String
—— 它是使用 Substring
创建的,拥有一片自己的内存空间。比较字符串
字符串/字符相等
用等于操作符(
==
)和不等于操作符(!=
)做字符串/字符相等。如果两个字符串(或者两个字符)的可扩展的字形群集是标准相等,那就认为它们是相等的。只要可扩展的字形群集有同样的语言意义和外观则认为它们标准相等,即使它们是由不同的 Unicode 标量构成。
如果两个可扩展的字形群集有相同的外观,但是语言意义不一样,则认为他们不同。比如英语的
A
(U+0041
)和俄语的A
(U+0410
)是不一样的可扩展字符集,所以他们不相等。前缀/后缀相等
hasPrefix(_:)
/hasSuffix(_:)
方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个 String
类型的参数,并返回一个布尔值。hasPrefix(_:)
和 hasSuffix(_:)
方法都是在每个字符串中逐字符比较其可扩展的字符群集是否标准相等。- 作者:黄x黄
- 链接:https://hxhowl.site/article/swift005
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章