Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 属性与方法

属性与方法

在 Swift 中,属性和方法是类(Class)和结构体(Struct)的核心组成部分。属性用于存储数据,而方法则用于定义与这些数据相关的行为。通过合理地使用属性和方法,您可以将数据和行为封装到类型中,从而提高代码的可读性、可维护性和重用性。


1. 属性

属性是类、结构体或枚举中的常量或变量,用于存储值。属性可以分为两种类型:存储属性和计算属性。

存储属性

存储属性用于存储常量或变量值,通常用于类和结构体中。存储属性可以是常量(let)或变量(var)。存储属性在实例化对象时分配内存。

class Car {
    var brand: String
    var year: Int

    init(brand: String, year: Int) {
        self.brand = brand
        self.year = year
    }
}

let myCar = Car(brand: "Toyota", year: 2020)
print(myCar.brand)  // 输出 "Toyota"

在上面的代码中,brand 和 year 是 Car 类的存储属性,它们存储关于 Car 实例的信息。

计算属性

计算属性不直接存储值,而是通过提供一个 getter 和 setter 来计算和返回值。计算属性通常用于当属性的值可以通过其他属性计算得出时。

struct Rectangle {
    var width: Double
    var height: Double

    // 计算属性
    var area: Double {
        return width * height
    }
}

let rectangle = Rectangle(width: 5.0, height: 3.0)
print(rectangle.area)  // 输出 15.0

在这个例子中,area 是 Rectangle 结构体的计算属性。它没有存储值,而是根据 width 和 height 的值动态计算结果。

只读计算属性

如果计算属性只提供 getter,而没有 setter,它就是只读计算属性。只读计算属性可以省略 get 关键字。

struct Circle {
    var radius: Double

    // 只读计算属性
    var area: Double {
        return .pi * radius * radius
    }
}

let circle = Circle(radius: 4.0)
print(circle.area)  // 输出 50.26548245743669

在上面的例子中,area 是一个只读的计算属性,它根据 radius 计算圆的面积。


2. 方法

方法是定义在类、结构体或枚举中的函数,用于操作数据或执行特定任务。方法可以访问和修改实例的属性。

实例方法

实例方法是与特定实例关联的方法,可以访问和修改实例的属性。

class Car {
    var brand: String
    var year: Int

    init(brand: String, year: Int) {
        self.brand = brand
        self.year = year
    }

    // 实例方法
    func displayDetails() {
        print("Brand: \(brand), Year: \(year)")
    }
}

let myCar = Car(brand: "Toyota", year: 2020)
myCar.displayDetails()  // 输出 "Brand: Toyota, Year: 2020"

在这个例子中,displayDetails 是 Car 类的实例方法,用于显示汽车的详细信息。

修改实例方法中的属性

实例方法可以修改实例的属性,前提是这些属性是变量(var)而不是常量(let)。

class Car {
    var brand: String
    var year: Int

    init(brand: String, year: Int) {
        self.brand = brand
        self.year = year
    }

    // 修改实例属性
    func updateYear(to newYear: Int) {
        year = newYear
    }
}

var myCar = Car(brand: "Toyota", year: 2020)
myCar.updateYear(to: 2023)
print(myCar.year)  // 输出 2023

在这个例子中,updateYear 是一个实例方法,它修改了 Car 实例的 year 属性。

类型方法

类型方法是与类型本身(而非特定实例)相关联的方法。类型方法通过 class(类)、static(结构体和枚举)关键字定义,并通过类型本身调用,而不是通过实例。

class Car {
    static var totalCars = 0

    init() {
        Car.totalCars += 1
    }

    // 类型方法
    static func displayTotalCars() {
        print("Total cars: \(totalCars)")
    }
}

let car1 = Car()
let car2 = Car()
Car.displayTotalCars()  // 输出 "Total cars: 2"

在这个例子中,displayTotalCars 是一个类型方法,它通过 Car 类调用,而不是通过 Car 类的实例调用。


3. 属性观察器

属性观察器用于监听属性值的变化。它可以在属性被设置新值时触发。Swift 提供了 willSet 和 didSet 两个属性观察器。

  • willSet:在属性的值被改变之前调用。
  • didSet:在属性的值被改变之后调用。
class Car {
    var brand: String {
        willSet {
            print("The brand is about to change to \(newValue).")
        }
        didSet {
            print("The brand was changed from \(oldValue) to \(brand).")
        }
    }

    init(brand: String) {
        self.brand = brand
    }
}

var myCar = Car(brand: "Toyota")
myCar.brand = "Honda"
// 输出:
// The brand is about to change to Honda.
// The brand was changed from Toyota to Honda.

在这个例子中,当 brand 属性的值发生变化时,willSet 和 didSet 被触发,分别打印出即将变化的值和变化后的值。


4. 总结

  • 存储属性 存储数据,直接关联到类、结构体或枚举的实例。
  • 计算属性 动态计算值,而不是存储值,通常用于基于其他属性计算得出的数据。
  • 实例方法 定义在类、结构体或枚举中,可以访问和修改实例的属性。
  • 类型方法 与类型本身相关联,不需要实例化类型即可调用。
  • 属性观察器 提供了对属性值变化的监控,可以通过 willSet 和 didSet 实现对属性值变化的响应。

通过理解和掌握属性与方法,您可以有效地组织数据和行为,构建更为健壮和灵活的代码。

Last Updated:: 12/1/24, 3:52 PM