Canoe

字符串和字符(Swift笔记)

2017.07.21

字符串字面量

let someString = “some thing value”


初始化空字符串

var empty = ""
var anotherStr = String()


使用字符

for character in "Dog!🐶".characters {
    print(character)
}
// D
// o
// g
// !
// 🐶

连接字符串

let str1 = “hello”
let str2 = “ world”
var welcome = str1 + str2

或者通过+=将一个字符串添加到一个已经存在的字符串变量上。
也可以使用append()方法将一个字符附加到另一个字符串变量尾部:

let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome 现在等于 "hello there!

字符串插值

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5

注意:

插值字符串中写在括号中的表达式不能包含非转义反斜杠 (),并且不能包含回车或换行符。不过,插值字符串可以包含其他字面量。


Unicode

Unicode是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。 Swift 的String和Character类型是完全兼容 Unicode 标准的。

Unicode 标量

Swift 的String类型是基于 Unicode 标量 建立的。 Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如U+0061表示小写的拉丁字母(LATIN SMALL LETTER A)("a"),U+1F425表示小鸡表情(FRONT-FACING BABY CHICK) ("🐥")。

字符串字面量的特殊字符

字符串字面量可以包含以下特殊字符:

  • 转义字符\0(空字符)、\\(反斜线)、\t(水平制表符)、\n(换行符)、\r(回车符)、\”(双引号)、\’(单引号)。
  • Unicode 标量,写成\u{n}(u为小写),其中n为任意一到八位十六进制数且可用的 Unicode 位码。

可扩展的字形群集

每一个 Swift 的Character类型代表一个可扩展的字形群。 一个可扩展的字形群是一个或多个可生成人类可读的字符 Unicode 标量的有序排列。
举个例子,字母é可以用单一的 Unicode 标量é(LATIN SMALL LETTER E WITH ACUTE, 或者U+00E9)来表示。然而一个标准的字母e(LATIN SMALL LETTER E或者U+0065) 加上一个急促重音(COMBINING ACTUE ACCENT)的标量(U+0301),这样一对标量就表示了同样的字母é。 这个急促重音的标量形象的将e转换成了é。


计算字符数量

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// 打印输出 "unusualMenagerie has 40 characters

访问和修改字符串

你可以通过字符串的属性和方法来访问和修改它,当然也可以用下标语法完成。

字符串索引

每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置。

“let greeting = "Guten Tag!"
greeting[greeting.*startIndex*]
// G
greeting[greeting.index(*before:* greeting.*endIndex*)]
// !
greeting[greeting.index(*after:*greeting.*startIndex*)]
// u
let index = greeting.index(greeting.*startIndex*, *offsetBy:* 7)
greeting[index]
// a

//错误示范
greeting[greeting.*endIndex*] // error
greeting.index(*after: endIndex*) // error

//indices
“for index in greeting.characters.indices {
   print("\(greeting[index]) ", terminator: "")
}
// 打印输出 "G u t e n   T a g ! “

插入和删除

//*插入*
“var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"

welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello there!”

//*删除*
“welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello”

注意:字符串索引和插入删除都可以用于Array,Dictionary,Set中。


比较字符串

swift提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。

字符串/字符相等

等于操作符== 以及不等于操作符!=

前缀/后缀相等

hasPrefix(_:)/hasSuffix(_:) 前缀/后缀
传入字符串,返回Bool值。


字符串的Unicode表示形式

当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的Unicode 标量会用 Unicode 定义的几种编码格式(encoding forms)编码。每一个字符串中的小块编码都被称代码单元(code units)。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。
代码示例

let dongString = "Dog!!🐶"

//UTF8
for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 226 128 188 240 159 144 182

//UTF16
for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 8252 55357 56374

//Unicode标量表示
for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
print("")
// 68 111 103 8252 128054
Comments
Write a Comment