字符串用于表示文本数据。
在 Swift 中,String 是由 Character 值组成的有序集合,其中每个字符都代表一个 Unicode 字符。
使用字符串字面量创建字符串,字符串字面量是由双引号(")包围的字符序列。
对于多行字符串,使用三个双引号("""):
let hello: String = "Hello, World!"
let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""
Swift 字符串可以与 Foundation 框架的 NSString 类无缝衔接,从而获得丰富的文本处理能力。
一个 Character 表示单个扩展字形簇,也就是一个由一到多个 Unicode 标量值 组成的、人类可读的字符。
Unicode 标量值是一个 21 位的码点,取值在 U+0000 到 U+D7FF 之间(含两端),或在 U+E000 到 U+10FFFF 之间(含两端)。
let aChar: Character = "A"
当你编写字符串字面量时,Swift 会自动将其类型推断为 String。
若要将单个字符存储为 Character,必须提供显式的类型注解:
let aString = "A" // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar)) // Prints Character
// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'
你可以使用加法运算符(+)把字符串拼接在一起:
print("honey" + "comb")
// Prints "honeycomb"
如果不先把字符转换成字符串,就无法用 + 直接把 Character 拼接到 String 上。
不过,你可以使用 append(_:) 方法,把字符串或字符直接追加到可变字符串上:
var greeting = "Hello"
let world = ", world"
let period: Character = "."
greeting.append(world)
print(greeting) // Prints "Hello, world"
greeting.append(period)
print(greeting) // Prints "Hello, world."
字符串插值 让你可以在字符串字面量中嵌入常量、变量、字面量和表达式,从而构造出字符串。
每个表达式都要放进一对括号里,并在括号前加上反斜杠(\( ... )):
let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"
字符串和字符提供了若干属性,用于查看它们的内容。
常见的字符串属性包括:
| 属性 | 说明 | 示例 |
|---|---|---|
isEmpty |
如果字符串不含任何字符,则返回 true
|
"Hello".isEmpty 的值为 false
|
count |
返回字符串中字符的个数 |
"Hello".count 的值为 5
|
完整的属性列表请参阅 Apple 的 String 文档。
常见的字符属性包括:
| 属性 | 说明 | 示例 |
|---|---|---|
isLowercase |
如果字符是小写,则返回 true
|
"a".isLowercase 的值为 true
|
isUppercase |
如果字符是大写,则返回 true
|
"A".isUppercase 的值为 true
|
isNumber |
如果字符是数字,则返回 true
|
"1".isNumber 的值为 true
|
isWhitespace |
如果字符是空白字符,则返回 true
|
" ".isWhitespace 的值为 true
|
完整的属性列表请参阅 Apple 的 Character 文档。
你可以使用 String(_:) 构造器把其他类型转换成字符串,它支持 Int、Double 和 Character 等标准类型:
let charX: Character = "x"
print(String(charX)) // Prints "x"
print(String(110)) // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"
Swift 字符串字面量支持多种转义序列,用于表示特殊字符:
| 序列 | 说明 |
|---|---|
\0 |
空字符 |
\\ |
反斜杠 |
\t |
水平制表符 |
\n |
换行符 |
\r |
回车符 |
\' |
单引号 |
\" |
双引号 |
\u{n} |
任意 Unicode 标量(十六进制) |
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.
let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖
在这个练习中,你将编写代码,帮助一家标牌公司为他们的标牌制作自定义信息。
定义以下常量字符串,它们将用于制作标牌:
birthday:它保存值 “Birthday”valentine:它保存值 “Valentine's Day”anniversary:它保存字符串 “Anniversary”定义以下常量字符,它们将用于制作标牌:
space:它保存值 “ ”(单个空格)exclamation:它保存值 “!”实现函数 buildSign(for:name:),它接受实参 for,该实参保存你在第一个任务中定义的三个字符串之一;以及实参 name,它是一个保存标牌所属者姓名的字符串。
你需要使用拼接来构建标牌的信息,并记得复用已定义的常量。
函数应以字符串形式返回标牌信息。
buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"
buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"
实现函数 graduationFor(name:year:),它接受实参 name,该实参是一个保存标牌所属者姓名的字符串;以及实参 year,它是一个保存此人毕业年份的整数。
你需要使用模板字符串来构建标牌的信息。
函数应以字符串形式返回标牌信息。
graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"
实现函数 costOf(sign:),它接受实参 sign,该实参是一个保存标牌信息的字符串。
标牌的基础价格为 20(以给定货币计)。此外,每个字母花费 2(空白字符也计入计算)。
函数应以整数形式返回标牌的费用。
costOf(sign: "Happy Birthday Grandma!")
// returns 66