字符串字面量
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号""
包裹着的具有固定顺序的文本字符集。 字符串字面量可以用于为常量和变量提供初始值:
let someString = "Some string literal value"
someString
常量通过字符串字面量进行初始化,Swift
会推断该常量为String
类型。
初始化空字符串
要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的String
实例:
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
判断该字符串是否为空:
print(emptyString.isEmpty) // true
字符串可变性
您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改
var variableString = "hello"
variableString += " world"
// variableString 现在为 "hello world"
let constantString = "hello"
constantString += " world"
// 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改。
字符串是值类型
String
的定义就是一个结构体,结构体是值类型。在Swift中struct和class的区别中进行了详细描述。
public struct String {
...
}
如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数、方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
var str1 = "hello"
var str2 = str1
str2 = "hello world"
print("str1: "+str1+" str2: "+str2)
// str1: hello str2: hello world
字符
Swift
中用characters
表示字符。
for character in "Dog".characters {
print(character)
}
// D
// o
// g
字符串可以通过传递一个值类型为Character
的数组作为自变量来初始化:
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters) // "Cat!🐱"
还可以判断字符串是否包含字符:
catString.contains("a") // true
获取字符个数:
catString.characters.count // 5
连接字符串和字符
通过加法运算符+
连接在一起创建一个新的字符串:
let string1 = "hello"
let string2 = " world"
let welcome = string1 + string2 // welcome 现在等于 "hello world"
通过加法赋值运算符+=
将一个字符串添加到一个已经存在字符串变量上:
var string = "hello"
string += " world" // string 现在等于 "hello world"
用append()
方法将一个字符附加到一个字符串变量的尾部:
var string = "hello world"
let ch: Character = "!"
string.append(ch) // string 现在等于 "hello world!"
string.append("...") // string 现在等于 "hello world!..."
字符串插值
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
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
位数字,注意不是所有的21
位Unicode
标量都代表一个字符,因为有一些标量是留作未来分配的。
字符串字面量的特殊字符
字符串字面量可以包含以下特殊字符:
- 转义字符
空字符\0
、反斜线\\
、水平制表符\t
、换行符\n
、回车符\r
、双引号\"
、单引号\'
。 -
Unicode
标量
写成\u{n}
(u
为小写),其中n
为任意一到八位十六进制数且可用的Unicode
位码。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}" // $, Unicode 标量 U+0024
let blackHeart = "\u{2665}" // ♥, Unicode 标量 U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496
访问字符串
每一个String
值都有一个关联的索引index
类型,String.Index
它对应着字符串中的每一个Character
的位置。
- 第一个索引
let string = "hello world" let start = string.startIndex // String.Index 类型 string[start] // 结果 h
- 最后一个索引
使用endIndex
属性可以获取最后一个Character
的后一个位置的索引。因此,endIndex
属性不能作为一个字符串的有效下标。string[string.endIndex] // 越界错误 string.index(after: endIndex) // 越界错误
- 索引
通过上一个索引和下一个索引获取对应索引:
通过偏移量获取对应的索引:string[string.index(after: string.startIndex)] // 第二个 e string[string.index(before: string.endIndex)] // 最后一个字符 d
let index = string.index(string.startIndex, offsetBy: 4) string[index] // o
- 根据字符获取索引
let index = string.index(of: "w")
修改字符串
插入
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"
welcome.insert(contentsOf:" world".characters, at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello world!"
删除
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello world"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello"
替换
var welcome = "hello world"
let range = welcome.index(welcome.startIndex, offsetBy: 6)..< welcome.endIndex
welcome.replaceSubrange(range, with: "Swift")
// welcome 现在等于 "hello Swift"
前缀、后缀相等
let string = "hello world"
string.hasPrefix("a") // false
string.hasSuffix("d") // true
大小写切换
string.lowercased()
string.uppercased()
字符串转数组
let string = "a,b,c,d"
string.components(separatedBy: ",") // ["a", "b", "c", "d"]