Logo
Section 1 / 5

Swift 面向对象编程概述

本节课将带你快速掌握 Swift 中面向对象编程的相关知识,详细介绍如何声明类、方法和属性。内容还包括如何向类中添加方法和属性,以及类实例的创建、初始化和析构过程。

检查点

Swift 面向对象编程概述

本节课将带你快速掌握 Swift 中面向对象编程的相关知识,详细介绍如何声明类、方法和属性。内容还包括如何向类中添加方法和属性,以及类实例的创建、初始化和析构过程。

Swift 提供了对开发面向对象应用程序的全面支持。然而,面向对象编程这一主题范围广泛,可以说已有整本书专门探讨该主题。因此,本课程无法对面向对象软件开发进行详尽概述。相反,我们将介绍面向对象编程的基本概念,然后重点讲解这些概念在 Swift 应用开发中的具体应用。

什么是实例?

对象(也称为类的实例)是自包含的功能模块,可以作为软件应用的构建单元被轻松使用和重复利用。

实例由数据变量(称为属性)和函数(称为方法)组成。这些可以通过实例访问和调用以执行任务,统称为类成员。

什么是类?

就像蓝图或建筑师图纸定义了物品或建筑建成后的外观一样,类定义了实例在创建时的结构。例如,它定义了方法将执行什么操作,以及属性将是什么。

声明 Swift 类

在创建实例之前,我们首先需要为该实例定义类的“蓝图”。在本课中,我们将创建一个银行账户类来演示 Swift 面向对象编程的基本概念。

声明新 Swift 类时,我们可以指定一个可选的父类,新类由此派生,并定义该类将包含的属性和方法。新类的基本语法如下:

1class 新类名: 父类 { 2 // 属性 3 // 实例方法 4 // 类型方法 5}

声明中的属性部分定义了类内部包含的变量和常量。这些的声明方式与 Swift 中其他变量或常量相同。

实例方法 和 类型方法 部分定义了可以在类及其实例上调用的方法。它们本质上是特定于类的函数,当被调用时执行特定操作,将在本课后续部分详细说明。

为了创建 BankAccount 类的示例框架,我们可以使用以下代码:

1class BankAccount { 2  3}

现在我们已经掌握了类的基本语法,下一步是在类中添加一些实例属性。

注意:命名类时,通常采用每个单词首字母大写的格式(称为 UpperCamelCase)。这与属性和函数名称的命名方式不同,后者通常以小写字母开头(称为 lowerCamelCase)。

向类中添加实例属性

面向对象编程的一个核心目标是实现所谓的 数据封装。数据封装的理念是:数据应存储在类中,并且只能通过该类中定义的方法进行访问。存储在类中的数据被称为 属性 或 实例变量。

我们的 BankAccount 类的实例需要存储一些数据,特别是银行账户号码和当前账户余额。属性的声明方式与在 Swift 中声明任何其他变量或常量相同。因此,我们可以这样添加这些变量:

1class BankAccount { 2 var accountBalance: Float = 0 3 var accountNumber: Int = 0 4}

在定义完属性后,接下来就是定义类的方法,以便在遵循数据封装原则的前提下操作这些属性。

定义方法

类的方法本质上是可以在该类上下文中被调用以执行特定任务的代码块。

方法有两种形式:类型方法 和 实例方法。类型方法作用于类本身,例如创建类的新实例;而实例方法则仅作用于类的实例(例如,在两个属性变量上执行算术运算并返回结果)。

实例方法在所属类的花括号内声明,使用标准的 Swift 函数声明语法。

类型方法的声明方式与实例方法类似,但声明前需加上 class 关键字。

例如,用于显示账户余额的方法可以这样声明:

1class BankAccount { 2  3 var accountBalance: Float = 0 4 var accountNumber: Int = 0 5  6 func displayBalance() 7 { 8 print("账号 \(accountNumber)") 9 print("当前余额为 \(accountBalance)") 10 } 11}

该方法是一个实例方法,因此不使用 class 关键字。

在设计 BankAccount 类时,可能需要能够直接在类上调用一个类型方法,以获取该类实例允许的最大余额。这使得应用程序可以在不先创建实例的情况下判断 BankAccount 类是否适合存储新客户的信息。该方法命名为 getMaxBalance,实现如下:

1class BankAccount { 2  3 var accountBalance: Float = 0 4 var accountNumber: Int = 0 5  6 func displayBalance() 7 { 8 print("账号 \(accountNumber)") 9 print("当前余额为 \(accountBalance)") 10 } 11  12 class func getMaxBalance() -> Float { 13 return 100000.00 14 } 15}

声明并初始化类实例

到目前为止,我们只是定义了类的蓝图。要对这个类进行操作,必须创建它的实例。此过程的第一步是声明一个变量来存储实例创建后的引用。我们这样操作:

1var account1: BankAccount = BankAccount()

执行后,BankAccount 类的一个实例就被创建了,并可通过 account1 变量访问。

初始化和反初始化类实例

类在创建时通常需要执行一些初始化任务。这些任务可以通过在类中添加 init 方法来实现。对于 BankAccount 类,当创建新实例时,能够用指定值初始化账户号码和余额属性会非常有用。为此,可以在类中这样编写 init 方法:

1class BankAccount { 2  3 var accountBalance: Float = 0 4 var accountNumber: Int = 0 5  6 init(number: Int, balance: Float) 7 { 8 accountNumber = number 9 accountBalance = balance 10 } 11  12 func displayBalance() 13 { 14 print("账号 \(accountNumber)") 15 print("当前余额为 \(accountBalance)") 16 } 17}

创建类实例时,现在必须提供账户号码和余额属性的初始化值,如下所示:

1var account1 = BankAccount(number: 12312312, balance: 400.54)

相反,如果在 Swift 运行时系统销毁类实例之前需要执行清理任务,可以通过在类定义中实现反初始化器(deinit)来完成:

1class BankAccount { 2  3 var accountBalance: Float = 0 4 var accountNumber: Int = 0 5  6 init(number: Int, balance: Float) 7 { 8 accountNumber = number 9 accountBalance = balance 10 } 11  12 deinit { 13 // 在此处执行必要的清理工作 14 } 15  16 func displayBalance() 17 { 18 print("账号 \(accountNumber)") 19 print("当前余额为 \(accountBalance)") 20 } 21}

调用方法和访问属性

现在是回顾本课已学内容的好时机。我们创建了一个名为 BankAccount 的新 Swift 类。在此类中,我们声明了一些属性来存储银行账户号码和当前余额,并添加了初始化器和一个用于显示当前余额信息的方法。在前面的部分中,我们介绍了如何创建并初始化该类的实例。接下来,我们需要学习如何调用实例方法和访问我们构建的属性。这最方便的方式是使用 点符号。

点符号通过在类实例后加一个点,再紧跟属性或方法名称来访问实例变量或调用实例方法:

1类实例.属性名 2类实例.实例方法()

例如,获取 accountBalance 实例变量的当前值:

1var balance1 = account1.accountBalance

点符号也可用于设置实例属性的值:

1account1.accountBalance = 6789.98

调用类实例上的方法也使用相同的技术。例如,调用 BankAccount 类实例的 displayBalance 方法:

1account1.displayBalance()

类型方法同样使用点符号调用,但必须在类类型上而不是类实例上调用:

1类名.类型方法()

例如,调用之前声明的 getMaxBalance 类型方法,需引用 BankAccount 类:

1var maxAllowed = BankAccount.getMaxBalance()

回顾并运行以下代码示例,查看我们的 BankAccount 类的实际运行效果:

1// 声明 BankAccount 类 2 3class BankAccount { 4 5 var accountBalance: Float = 0 6 var accountNumber: Int = 0 7 8 init(number: Int, balance: Float) 9 { 10 accountNumber = number 11 accountBalance = balance 12 } 13 14 deinit { 15 // 在此处执行必要的清理工作 16 } 17 18 func displayBalance() 19 { 20 print("账号 \(accountNumber)") 21 print("当前余额为 \(accountBalance)") 22 } 23 24 class func getMaxBalance() -> Float { 25 return 100000.00 26 } 27} 28 29// 创建并初始化类的实例 30var account1 = BankAccount(number: 12312312, balance: 400.54) 31 32// 通过 accountBalance 属性显示当前余额 33print("当前余额 = \(account1.accountBalance)") 34 35// 将新余额赋给 accountBalance 属性 36account1.accountBalance = 6789.98 37 38// 调用 displayBalance() 方法输出当前余额 39account1.displayBalance() 40 41// 调用 getMaxBalance 类型方法 42var maxAllowed = BankAccount.getMaxBalance() 43print("允许的最大账户余额 = \(maxAllowed)")

课程总结

  • 类是创建对象的蓝图。

  • 类在 Swift 中使用 class 关键字声明。

  • 对象(也称为实例)由类声明创建。

  • 类包含数据(属性)和函数(方法),可通过点符号访问和调用。

  • 类可以包含初始化器和反初始化器,分别在实例创建和销毁时被调用。

测验

确保你理解了 Swift 中面向对象编程的基本概念,完成以下测验。

练习

完成以下练习,以提升你的面向对象编程能力。

练习 1

在以下示例中添加代码,创建类的实例并调用 doSomething 方法:

练习

1class MyClass { 2 func doSomething() { 3 print("我做了一些事情") 4 } 5}

解答

1class MyClass { 2 func doSomething() { 3 print("我做了一些事情") 4 } 5} 6 7let myClass = MyClass() 8myClass.doSomething()

练习 2

为以下类添加初始化器,使在创建类实例时能够初始化两个 String 属性:

练习

1class DemoClass { 2 3 var firstname = "" 4 var surname = "" 5 6 func printName() { 7 print("你好 \(firstname) \(surname)") 8 } 9} 10 11let demoClass = DemoClass(first: "特伦特", last: "雷兹诺") 12demoClass.printName()

解答

1class DemoClass { 2 3 var firstname = "" 4 var surname = "" 5 6 init(first: String, last: String) { 7 firstname = first 8 surname = last 9 } 10 11 func printName() { 12 print("你好 \(firstname) \(surname)") 13 } 14} 15 16let demoClass = DemoClass(first: "特伦特", last: "雷兹诺") 17demoClass.printName()

练习 3

以下类声明中的 myMethod 方法是一个 类型方法。请添加代码调用该方法:

练习

1class DemoClass { 2 3 class func myMethod() { 4 print("方法已调用") 5 } 6 7}

解答

1class DemoClass { 2 3 class func myMethod() { 4 print("方法已调用") 5 } 6 7} 8 9DemoClass.myMethod()

Quiz

单选题

在 Swift 类声明中,使用哪个关键字来声明一个类型方法?

1 / 2

Swift 函数、方法和闭包

在 Swift 中使用 self