// 字符串 和 字符
// 字符串 是有序的 Character (字符) 类型的值的集合, 通过 String 类型的集合
// swift 的 String 和 Character 类型提供了快速和兼容 Unicode 的方式供你的代码使用, 创建和操作字符串的语法与C语言中的字符串相似, 轻量并且已读
// 字符串连接操作只需要简单地通过 + 符号将两个字符串连接即可
// 与swift 中其他值一样, 能否更改字符串的值, 取决于其被定义为常量还是变量
// 注意:
// swift 的 String 类型与 Foundation NSString 类进行了无缝对接, Foundation 也可以对 String 进行扩展, 暴露在 NSString 中定义的方法 , 这意味着,如果你在 String 中调用这些 NSString 的方法, 将不用进行转换
var ss = "aaaaaaa"
let bb = ss + "bbbbbb"
print(bb)
// 字符串字面量
// 字符串字面量室友双引号 ("")包裹着的具有固定顺序的文本字符集
// 字符串字面量可以为常量或者变量提供初始值
// 初始化空字符串
// 要创建一个空字符串作为初始值, 可以将空的字符串字面量赋值给变量, 也可以初始化一个新的 String 实例
var emptyString = "" // 空字符串字面量
var antherEmptyString = String() // 初始化方法
// 你可以通过检查其 Bool 类型的 isEmpty 属性来判断改字符串是否为空
if emptyString.isEmpty{
print("Nothing to see here")
}
// 字符串可变性
// 你可以通过讲一个特定字符串分配给一个变量来对其进行修改, 或者分配给一个常量保证其不会被修改
// 注意:
// Objective-C 和 Cocoa 中 , 你需要通过选择两个不同的类 (NSString 和 NSMutableString) 来指定字符串是否可以被修改
// 使用字符
// 你可以通过 for-in 循环来遍历字符串中的 characters 属性来获取每一个字符的值;
for charcater in "Dog!??".characters {
print(charcater)
}
// 另外,通过表明一个 Character 类型并用字符字面量进行复制, 可以建立一个独立的字符常量或变量
let exclamationMark: Character = "!"
// 字符串可以通过传递一个值类型为 Character 的数组作为自变量来初始化
let catCahracter: [Character] = ["C","a","t","!","??"]
let catString = String(catCahracter)
print(catString)
// 连接字符串和字符
// 字符串可以通过加法运算符 (+) 相加在一起(或称连接)创建一个新的字符串
let string1 = "hello"
let string2 = " world"
var welcome = string1 + string2
// 你也可以通过加法赋值运算符 (+=) 将一个字符串添加到一个已经存在的字符串之后
var instryction = "look over"
instryction += string2
// 你也可以用 append() 方法讲一个字符添加到字符串变量的尾部
let exclamationmark: Character = "!"
welcome.append(exclamationMark)
welcome.append(string2)
// 注意:你不能将一个字符串或者字符添加到一个已经存在的字符变量上面,因为字符变量只能包含一个字符
// 字符串插值
// 字符串插值是一种构建新字符串的方式, 可以再其中包含常量.变量,字面量,和表达式
// 你插入的字符串字面量的每一项都在以 反斜杠 为 前缀的 圆括号 内
// 注意:
// 插值字符串中写在括号内的表达式不能包含非转义反斜杠(\), 并且不能包含 回车 或 换行符, 不过插值字符串可以包含其他字面量
// Unicode
// swift 的 string 类型是基于 Unicode 标量建立的
// Unicode 标量是对应字符或者修饰符的唯一的 21 位数字,
// 字符串字面量的特殊字符
// 字符串字面量可以包含以下特殊字符
// 转义字符 : \0 (空字符) , \\ (反斜线) , \n (换行符) , \r (回车符)
// \" (双引号) , \‘ (单引号) , Unicode标量, 写成\u{n} (u 为小写) 其中n为任意一到八位十六进制数且可用的 Unicode 位码
// 可扩展的字形群集
// 每一个Swift 的 Character 类型代表一个可扩展的字形群, 一个可扩展的字形群是一个或多个可生成人类可读的字符 Unicode 标量的有序排列
// 计算字符数量
// 如果想要获得一个字符串中 Character 值的数量, 可以使用字符串的 character 属性的 count 属性
var word = "cafe"
print("the number of characters in \(word) is \(word.characters.count)")
// 打印输出 "the number of characters in cafe is 4"
// 访问和修改字符串
// 你可以通过字符串的属性和方法来访问和修改他, 当然也可以用下标语法完成
// 字符串索引
// 每一个 string 值都有一个关联的索引(index)类型, String.Index, 他对应着字符串中的每一个 character 的位置
// 不同的字符串可能会占用不同数量的内存空间, 所以要知道 character 的确定位置, 就必须从 string 的开头遍历每一个 Unicode 标量直到结尾, 因此, Swift 的字符串不能用整数(interger)做索引
// 使用 startIndex 属性可以获取一个 string 的第一个 character 的索引, 使用 endIndex 属性可以获取最后一个 character 的后一个位置的索引, 因此 endIndex 不能作为一个字符串的有效下标, 如果 string 是空串, startIndex 和 endIndex 是相等的
// 通过调用 string 的 index(before:) 或 index(after:) 方法, 可以立即得到前面或者后面的一个索引, 您还可以通过调用 index(_:offsetBy:) 方法来获取对应偏移量的索引, 这种方法可以避免多次调用 index(before:) 或者 index(after:) 方法
let greenting = "Guten Tag!"
print(greenting[greenting.startIndex])
greenting[greenting.index(before: greenting.endIndex)]
greenting[greenting.index(after: greenting.startIndex)]
let index = greenting.index(greenting.startIndex, offsetBy: 7)
greenting[index]
// 使用 character 属性的 indices 属性会创建一个包好全部索引的范围(Range), 用来在一个字符串中访问单个字符
for index in greenting.characters.indices {
print("\(greenting[index])")
}
// 注意 : 你可以使用startIndex 和 endIndex 属性或者(index:before), index(after:) 和index:(_:offsetBy:) 方法在任意七个确定并遵循 collection 协议的类型里面, 如上文所示是使用在 String 中, 您也可以使用在 array, dictionary 和 set 中
// 插入和删除
// 调用 insert(_:at:) 方法可以在一个字符串的指定索引插入一个字符, 调用 insert(contentsOf:at:) 方法可以在一个字符串的指定索引插入一个段字符串
var welcomeStr = "hello"
welcomeStr.insert("!", at: welcomeStr.endIndex)
welcomeStr.insert(contentsOf: " there".characters, at: welcomeStr.index(before: welcomeStr.endIndex))
// 调用 remove(at:) 方法可以在一个字符串的指定索引删除一个字符,
// 调用 removeSubrange(_:) 方法可以在一个字符串的指定索引删除一个子字符串
welcomeStr.remove(at: welcomeStr.index(before: welcomeStr.endIndex))
let renge = welcomeStr.index(welcomeStr.endIndex, offsetBy: -6)..<welcomeStr.endIndex
welcomeStr.removeSubrange(renge)
// 注意 : 你可以使用 insert(_:at:) , insert(contentsOf:at:) , remove(at:) 和 removeSubrange(_:) 方法在任意一个遵循的并确认的 RangeReplaceableCollection 协议的类型里面 , 如上文所示是使用在 string 中, 您也可以使用在 Array , dictionary 和 set 之中
// 比较字符串
// swift 提供了三种方式来比较文本值, 字符串字符相等, 前缀相等 和 后缀相等
// 字符串/字符相等
// 字符串/字符可以使用等于操作符(==), 和不等于操作符(!=)
let quotation = "we‘re a lot alike, you and I."
let sameQuotation = "we‘re a lot alike, you and I."
if quotation == sameQuotation {
print("There two strings are considered equal")
}
// 前缀/后缀相等
// 通过调用字符串的 hasPrefix(_:) / hasSuffix(_:) 方法来检查字符串是否拥有特定前缀/后缀, 两个方法均接受一个 String 类型的参数, 并返回一个布尔值
// 字符串的 Unicode 表示形式
// 当一个 Unicode 字符串被写进文本文件或者其他存储是, 字符串中的 Unicode 标量会用 Unicode 定义的几种 编码格式 (encodeing forms) 编码, 每一个字符串中的小块编码被称为 代码单元 (code units) , 这些包括UTF-8编码合适(编码字符串为8位的代码单元), UTF-16, UTF-32
// swift 提供了几种不同的方式来访问字符串的 Unicode 表示形式
// 你可以利用 for-in 来对字符串进行遍历, 从而以 Unicode 可扩展的字符群集的方式访问每一个 cahracer 值
// UTF-8 表示
// 你可以通过 String 的 UTF-8 属性来访问他的 UTF-8 表示