Swiftswift

Swift - Strings and Characters

2018-05-25  本文已影响4人  ienos

多行字符串

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 是一个值类型

循环读取字符

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 他们的扩展字形集群规范化相等,那么他们相等

// eg: eAcuteQuestion = combinedEAcuteQuestion
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"

Unicode

for codeUnit in greeting.utf16 {
    // eg U+1F436 10进制 ASCII 码
    // UTF16 : [55357, 56374]
    // UTF8 : [240, 159, 144, 182]
    // UTF32 : [128054]
}
上一篇 下一篇

猜你喜欢

热点阅读