Swift 学习- 04 -- 字符串和字符

// 字符串 和 字符

// 字符串 是有序的 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 表示