多行字符串
- 使用""换行,增加代码可读性,并不会加入到 String Value 中,即实际字符串并不会换行。
- 与结尾引号对齐的前面的空白将会忽略,反之,空白加入 String Value
let someString = "Some string literal value"
// 三个双引号,多行
let mulilineString = """
First line
Second line \
Third line \
"""
转义字符
let specialString = """
\\ 反斜线
\0 空字符
\t 制表符
\n 换行符
\r 回车符
\' 单引号
\" 双引号
\""" OR \"\"\" 三个双引号
\u{1F496} 1-8位十六进制等效于有效的 Unicode 编码
"""
//
var lastLineNotLineBreak = specialString + " multString 最后一行不会添加换行符"
print(lastLineNotLineBreak)
空字符串
// 两种形式
var emptyString = ""
var anotherEmptyString = String()
// 判断是否为空
emptyString.isEmpty
可变与不可变 var OR let
String 是一个值类型
- 当 String 的值被传递到函数/方法,或者被传递一个变量/常量时是 copy 的
- 一个新的 copy String 值也是创建,并不是原来的那个;无需考虑来自于哪里,只能由自己改动
循环读取字符
for character in "Dog!🐶" {
print(character)
}
通过 Character 数组构造字符串
let exclamationMark: Character = "!"
// String 能够通过一个 Character 构造的数组初始化
let catCharactors: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharactors)
字符串拼接
var instrution = "look" + " " + "over"
instrution.append("!")
instrution += "hello"
print(instrution)
扩展字形集群
每一个 Character 代表一个扩展字形集群,一个扩展字形集群是一个由一个或多个 Unicode 标量组成的字符。
let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e followed by
字符串中的字符数
let unusualMenagerie = "Koala, Snail, Penguin, Dromedary"
unusualMenagerie.count
扩展字形集群不会影响字符数
var word = "cafe" // word.count = 4
word += "\u{301}" // word.count = 4
swift 字符数:Unicode 扩展字形集群的数量
OC 字符数:16位代码单元在 UTF-16 中的数量
字符串索引
下面的方法适用于遵循 Collection 协议, 例如 Array, Dictionary, Set
var greeting = "Guten Tag!"
greeting.startIndex // 第一个字符的索引
greeting.endIndex // 最后一个字符的索引 + 1
greeting.index(greeting.startIndex, offsetBy: 4) // 第一个字符的索引 + 4
greeting.index(after: greeting.startIndex) // 第一个字符的索引 + 1
greeting.index(before: greeting.endIndex) // 最后一个字符的索引
// 越界会报错
//greeting[greeting.endIndex] // Error
greeting.indices // 索引数组
插入和移除
下面方法适用于遵循 RangeReplaceableCollection 协议,例如 Array, Dictionary, Set
greeting.insert(contentsOf: "content", at: greeting.index(before: greeting.endIndex))
greeting.remove(at: greeting.index(before: greeting.endIndex))
let range = greeting.index(greeting.endIndex, offsetBy: 6) ..< greeting.endIndex
greeting.removeSubrange(range)
Substring
let index = greeting.index(of: ",") ?? greeting.endIndex
// Substring , 和 String 共享内存
let begining = greeting[..<index]
// 由 Substring 创建出来的 String ,开辟新的内存
let newString = String(begining)
字符串比较
原则:如果两个 String 他们的扩展字形集群规范化相等,那么他们相等
- 字符串和字符 == 和 !=
- 前缀 .hasPrefix("")
- 后缀 .hasSuffix("")
// eg: eAcuteQuestion = combinedEAcuteQuestion
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"
Unicode
- UTF-8 - 8bit 代码单元:.utf8
- UTF-16 - 16bit 代码单元:.utf16
- UTF-32 - 32bit 代码单元 相当于 21-bit Unicode 标量值:.unicodeScalars
for codeUnit in greeting.utf16 {
// eg U+1F436 10进制 ASCII 码
// UTF16 : [55357, 56374]
// UTF8 : [240, 159, 144, 182]
// UTF32 : [128054]
}
网友评论