轨道
/
Swift
Swift
/
练习
/
Cal 的定制招牌店
Cal 的定制招牌店

Cal 的定制招牌店

学习练习

简介

字符串用于表示文本数据。 在 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 💖

说明

在这个练习中,你将编写代码,帮助一家标牌公司为他们的标牌制作自定义信息。

1. 创建一组有用的字符串

定义以下常量字符串,它们将用于制作标牌:

  • birthday:它保存值 “Birthday”
  • valentine:它保存值 “Valentine's Day”
  • anniversary:它保存字符串 “Anniversary”

2. 创建一组有用的字符

定义以下常量字符,它们将用于制作标牌:

  • space:它保存值 “ ”(单个空格)
  • exclamation:它保存值 “!”

3. 组合短语来构建消息

实现函数 buildSign(for:name:),它接受实参 for,该实参保存你在第一个任务中定义的三个字符串之一;以及实参 name,它是一个保存标牌所属者姓名的字符串。 你需要使用拼接来构建标牌的信息,并记得复用已定义的常量。 函数应以字符串形式返回标牌信息。

buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"

buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"

4. 制作毕业标牌

实现函数 graduationFor(name:year:),它接受实参 name,该实参是一个保存标牌所属者姓名的字符串;以及实参 year,它是一个保存此人毕业年份的整数。 你需要使用模板字符串来构建标牌的信息。 函数应以字符串形式返回标牌信息。

graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"

5. 计算标牌的费用

实现函数 costOf(sign:),它接受实参 sign,该实参是一个保存标牌信息的字符串。 标牌的基础价格为 20(以给定货币计)。此外,每个字母花费 2(空白字符也计入计算)。 函数应以整数形式返回标牌的费用。

costOf(sign: "Happy Birthday Grandma!")
// returns 66
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Swift Exercism

准备好开始 Cal 的定制招牌店 了吗?

注册 Exercism,借助 35 个概念116 个练习 和真人导师指导,学习并掌握 Swift,全部免费。