字符串是由双引号括起来字符序列,在swift中字符串是String类型,字符串是由Character组成,并且是基于Unicode的。字符串支持插值,通过插值可以方便地把其他值与字符串组合形成新的字符串。通过关键字let来声明不可变字符串,通过关键字var声明可变字符串。字符串是值类型(详细内容后续章节会讲到,简单理解为与C中的int、double、struct语法行为一致)。
let num = 3
var str = "the num's value is \(num)" // the num's value is 3
Swift的String类型是Foundation的NSString类桥接。 Foundation还扩展了String以公开由NSString定义的方法。 这意味着,如果您导入Foundation,则可以在不转换的情况下访问String上的NSString方法。
3.1 多行字符串
多行字符串是swift新推出的一种语法形式,其中有一些容易混淆的地方,请大家主要。目前简书还不支持swift的多行字符串的语法高亮显示,通过截图形式展示其语法。
image.png
- 使用三个双引号作为多行字符串的开头与结尾
- 由于使用三个双引号作为多行字符串语法标记,所以其内部可以包含双引号,而不需要转义字符的协助
- 换行符也被保存,上图显示的内容即是最终输出的效果
以上示例中where shall I Begin, 与下一行的please your ....是有换行符的,当不想要此换行符时可以采用如下的语法形式——在语句最右侧输入反斜杠。
let softWrappedQuotation = """
The White Rabbit put on his spectacles. "Where shall I begin, \
please your Majesty?" he asked.
"Begin at the beginning," the King said gravely, "and go on \
till you come to the end; then stop."
"""
要创建以换行符开头或结尾的多行字符串文字,请将空行写为第一行或最后一行。 例如:
let lineBreaks = """
This string starts with a line break.
It also ends with a line break.
"""
可以缩进多行字符串以匹配周围的代码。 在右引号( """ )之前的空格告诉Swift在所有其他行之前要忽略哪些空格。但是,如果你在行的开头写一个空白,除了在结束引号之前的那些空格,那个空格就是包括在内。
image.png
3.2 转义字符
- \0 (空字符)
- \ (反斜杠)
- \t (水平制表符)
- \n (换行符)
- \r \n (回车符)
- " (双引号)
- ' (单个)引号)
3.3 Unicode标量
一个任意的Unicode标量值,写为\u{ n } ,其中n是1-8位十六进制数。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}" // $, Unicode scalar U+0024
let blackHeart = "\u{2665}" // ♥, Unicode scalar U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode scalar U+1F496
请注意,以下同样是单个字符常量,但是第一个只有一个标量,第二个却有两个标量
let eAcute : Character = "\u{E9}" // é
let combinedEAcute : Character = "\u{65}\u{301}" // e followed by ́
根据以上示例,可以看出给字符串添加字符后,字符串的字符数并不一定变化
关于此部分内容,如有需要,请自行查阅相关资料
3.4 空字符串
var emptyString = "" // 空字符串
var anotherEmptyString = String () // 空字符串
// 通过isEmpty属性来验证是否是空字符串
if emptyString.isEmpty {
print ( "Nothing to see here" )
}
3.4 字符串与字符
// 通过for in输出字符串中所有的字符
for character in "Dog!🐶" {
print ( character )
}
// D
// o
// g
// !
// 🐶
// 声明一个字符
let exclamationMark : Character = "!"
// 用字符数组生成字符串
let catCharacters : [ Character ] = [ "C" , "a" , "t" , "!" , "🐱" ]
let catString = String ( catCharacters )
print ( catString )
// Prints "Cat!🐱"
// 通过append方法把字符追加到字符串的结尾
let exclamationMark : Character = "!"
welcome.append ( exclamationMark )
// welcome now equals "hello there!"
3.5 字符串常用操作
可以通过下标相关的操作来访问字符串中的字符;字符串的startIndex是第一个字符串所处的位置;endIndex是最后一个字符的后一个位置,该位置不存在任何字符。
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: greeting.endIndex) // Error
// 使用indices属性可以访问字符串中各个字符的所有索引。
for index in greeting.indices {
print("\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n T a g ! "
// 插入字符
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"
// 插入字符串
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"
// 删除单个字符
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"
// 删除字符子串
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"
3.6 字符子串
由于字符子串具有与源串公用内存的特性,所以单独进行说明。
let greeting = "Hello, world!"
let index = greeting . firstIndex ( of : "," ) ?? greeting . endIndex
let beginning = greeting [..< index ]
// beginning is "Hello"
// 以上代码中获得的字符子串适合短时使用且最好不修改其内容
// 如果想长时间使用,则需要把字符子串转化为一个字符串
let newString = String ( beginning )
image.png
从上图可以看出,作为字符子串时,由于优化了性能,子串与源串共享内存;之后进行强制内型转换后才重新单独分配了内存。
网友评论