05.类和结构体
目录介绍
- 5.1 结构体
- 5.1.1 什么是结构体
- 5.1.2 结构体语法
- 5.1.3 结构体案例
- 5.1.4 结构体应用场景
- 5.2 类
- 5.2.1 什么是类
- 5.2.2 类语法和定义
- 5.2.3 访问类属性
- 5.2.4 恒等运算符
5.1 结构体
5.1.1 什么是结构体
Swift 结构体是构建代码所用的一种通用且灵活的构造体。
我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。
与 C 和 Objective C 不同的是:
- 结构体不需要包含实现文件和接口。
- 结构体允许我们创建一个单一文件,且系统会自动生成面向其它代码的外部接口。
结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的。
5.1.2 结构体语法
我们通过关键字 struct 来定义结构体:
struct nameStruct {
Definition 1
Definition 2
……
Definition N
}
5.1.3 结构体案例
下面是一个使用Swift中结构体的简单案例:
// 定义一个结构体
struct Person {
var name: String
var age: Int
// 结构体方法
func introduce() {
print("我叫\(name),今年\(age)岁。")
}
}
// 创建结构体实例
var person1 = Person(name: "Alice", age: 25)
var person2 = Person(name: "Bob", age: 30)
// 访问结构体属性
print(person1.name) // 输出: "Alice"
print(person2.age) // 输出: 30
// 调用结构体方法
person1.introduce() // 输出: "我叫Alice,今年25岁。"
person2.introduce() // 输出: "我叫Bob,今年30岁。"
结构体是值类型,当我们将结构体赋值给另一个变量或常量时,会创建一个新的副本。这意味着person1和person2是独立的实例,它们的属性可以独立地进行修改。
5.1.4 结构体应用场景
与类相比,结构体是值类型,它们在传递和复制时会创建副本。这使得结构体在某些情况下更适合使用,特别是对于简单的数据类型和小型数据模型。
结构体在Swift中有许多应用场景,以下是一些常见的使用情况:
- 配置选项:结构体可以用于表示配置选项,例如游戏设置、应用程序配置或用户首选项。每个选项可以作为结构体的属性,以便轻松地进行设置和访问。
- 数据缓存:结构体可以用于创建轻量级的数据缓存,以便在应用程序中存储和传递数据。结构体的值类型特性使得复制和传递数据更加高效。
- API设计:结构体可以用于设计API,以提供一组相关的属性和方法。通过将相关功能封装在结构体中,可以提供更清晰、可读性更高的代码接口。
5.2 类
5.2.1 什么是类
Swift 类是构建代码所用的一种通用且灵活的构造体。
我们可以为类定义属性(常量、变量)和方法。
与其他编程语言所不同的是,Swift 并不要求你为自定义类去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类,系统会自动生成面向其它代码的外部接口。
5.2.2 类语法和定义
语法:
class classname {
Definition 1
Definition 2
……
Definition N
}
类定义:
class student{
var studname: String
var mark: Int
var mark2: Int
}
5.2.3 访问类属性
类的属性可以通过 . 来访问。格式为:实例化类名.属性名:
class studentMarks {
var mark1 = 300
var mark2 = 400
var mark3 = 900
}
let marks = studentMarks()
print("Mark1 is \(marks.mark1)")
print("Mark2 is \(marks.mark2)")
print("Mark3 is \(marks.mark3)")
5.2.4 恒等运算符
因为类是引用类型,有可能有多个常量和变量在后台同时引用某一个类实例。
为了能够判定两个常量或者变量是否引用同一个类实例,Swift 内建了两个恒等运算符:
- 运算符为:=== 如果两个常量或者变量引用同一个类实例则返回 true
- 运算符为:!== 如果两个常量或者变量引用不同一个类实例则返回 true
class SampleClass: Equatable {
let myProperty: String
init(s: String) {
myProperty = s
}
}
func ==(lhs: SampleClass, rhs: SampleClass) -> Bool {
return lhs.myProperty == rhs.myProperty
}
let spClass1 = SampleClass(s: "Hello")
let spClass2 = SampleClass(s: "Hello")
if spClass1 === spClass2 {// false
print("引用相同的类实例 \(spClass1)")
}
if spClass1 !== spClass2 {// true
print("引用不相同的类实例 \(spClass2)")
}