Swift 属性与方法详解(五)

Swift 是一门强大的编程语言,广泛应用于 iOS 和 macOS 应用开发。本文将详细介绍 Swift 中的属性和方法,帮助你更好地理解和应用这些核心概念。无论你是初学者还是有一定经验的开发者,本文都能为你提供有价值的见解和实用技巧。

什么是属性?

在 Swift 中,属性是将值与特定类、结构体或枚举关联的常量或变量。属性可以分为以下几类:

  • 存储属性:存储在类或结构体的实例中的值。
  • 计算属性:计算并返回一个值,但不存储。

存储属性 vs 计算属性

存储属性

存储属性就像一个容器,用于存储常量或变量,作为类或结构体实例的一部分。存储属性可以是变量存储属性(用 var 关键字定义),也可以是常量存储属性(用 let 关键字定义)。

struct Number {
    var digits: Int
    let pi = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print(n.digits) // 输出 67
print(n.pi)     // 输出 3.1415

在定义存储属性时,可以指定默认值,也可以在构造过程中设置或修改存储属性的值,甚至修改常量存储属性的值。

struct Number {
    var digits: Int
    let pi = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print(n.digits) // 输出 67
print(n.pi)     // 输出 3.1415

计算属性

计算属性是一种特殊的属性,用于计算值而不是存储值。计算属性可以用于类、结构体和枚举。

class Sample {
    var no = 0.0
}

class Sample {
    var no = 0
}

在计算属性时,getter 用于获取值,setter 用于设置值。计算属性不存储值,而是计算并返回一个值。

存储属性

存储在类或结构体实例中的值。存储属性用于存储数据,计算属性则用于计算值。

存储属性

存储属性用于存储值,计算属性则用于计算值。

存储属性

存储属性是类或结构体实例中用于存储值的地方。存储属性用于存储值,而计算属性则用于计算值。

存储属性

存储属性用于存储类或结构体实例的值。在 Swift 中,属性可以分为几种类型:

  • 存储属性:用于存储值。
  • 计算属性:用于计算值,不存储。

示例

class Sample {
    var storedProperty = 0
    var computedProperty: Int {
        get { 
            return 0
        } 
        set { 
            print("Computed Property")
        }
}

let sample = Sample()
print(sample.computedProperty)

类型属性

  • 存储属性:存储常量或变量作为实例的一部分。
  • 计算属性:计算(而不是存储)一个值。
  • 延迟存储属性:当首次访问时才计算其初始值。

延迟存储属性

延迟存储属性是指当首次访问时才计算其初始值的属性。在属性声明前使用 lazy 关键字来标示一个延迟存储属性。

class Sample {
    lazy var number = Number(name: "Runoob Swift 教程")
}

class Number {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var firstSample = Sample()
print(firstSample.number.name) // 输出 "Runoob Swift 教程"

计算属性

计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值。

class Sample {
    var no1 = 0.0, no2 = 0.0
    var length = 300.0, breadth = 150.0

    var middle: (Double, Double) {
        get {
            return (length / 2, breadth / 2)
        }
        set(axis) {
            no1 = axis.0 - (length / 2)
            no2 = axis.1 - (breadth / 2)
        }
    }
}

var result = Sample()
print(result.middle) // 输出 (150.0, 75.0)
result.middle = (0.0, 10.0)
print(result.no1) // 输出 -150.0
print(result.no2) // 输出 -65.0

如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称 newValue。

只读计算属性

只有 getter 没有 setter 的计算属性称为只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。

class Film {
    var title = ""
    var duration = 0.0
    var metaInfo: [String: String] {
        return [
            "title": self.title,
            "duration": "\(self.duration)"
        ]
    }
}

var movie = Film()
movie.title = "Swift 属性"
movie.duration = 3.09

print(movie.metaInfo["title"]!) // 输出 "Swift 属性"
print(movie.metaInfo["duration"]!) // 输出 "3.09"

属性观察器

属性观察器监控和响应属性值的变化,每次属性被设置值时都会调用属性观察器,即使新的值与当前值相同也不例外。


class SamplePgm {
    var counter: Int = 0 {
        willSet(newTotal) {
            print("计数器: \(newTotal)")
        }
        didSet {
            if counter > oldValue {
                print("新增数 \(counter - oldValue)")
            }
        }
    }
}

let newCounter = SamplePgm()
newCounter.counter = 100
newCounter.counter = 800

全局变量和局部变量

计算属性和属性观察器的模式也可以用于全局变量和局部变量。

  • 局部变量:在函数、方法或闭包内部定义的变量。
  • 全局变量:在函数、方法、闭包或任何类型之外定义的变量。

类型属性

类型属性是作为类型定义的一部分写在类型最外层的花括号内。使用 static 关键字定义值类型的类型属性,使用 class 关键字定义类的类型属性。

struct StructName {
    static var storedTypeProperty = ""
    static var computedTypeProperty: Int {
        // 返回一个 Int 值
    }
}

enum EnumName {
    static var storedTypeProperty = ""
    static var computedTypeProperty: Int {
        // 返回一个 Int 值
    }
}

class ClassName {
    class var computedTypeProperty: Int {
        // 返回一个 Int 值
    }
}

获取和设置类型属性的值

类型属性的访问也是通过点运算符进行,但通过类型本身来获取和设置,而不是通过实例。

实例

struct Student {
    static var count = 0
    static var total = 0
}

print(Student.count) // 输出 0

实例

struct Student {
    static var count = 0
}

var student = Student()
print(student.count) // 输出 0

总结

通过本文,我们深入探讨了 Swift 中的属性及其应用。从存储属性到计算属性,再到属性观察器,每一种属性都有其独特的用途和应用场景。希望本文能帮助你更好地理解和应用这些核心概念,提升你的编程技能。无论是初学者还是有经验的开发者,掌握这些知识都将使你在 Swift 编程中更加得心应手。