Swift 结构体与类的区别与用法

开发者心声 2024-02-01 ⋅ 23 阅读

在 Swift 中,结构体(struct)与类(class)是用于创建自定义数据类型的两个主要方式。它们具有不同的特性和用法,本文将对它们的区别进行详细解析,并提供一些使用示例。

结构体和类的定义

结构体的定义

结构体是一种值类型(value type),它将多个相关的值合并在一起,形成一个新的数据结构。在 Swift 中,结构体通过 struct 关键字进行定义,可以包含属性(property)和方法(method)。

struct Point {
    var x: Int
    var y: Int
    
    func printCoordinates() {
        print("x: \(x), y: \(y)")
    }
}

类的定义

类是一种引用类型(reference type),它可以包含属性和方法,还可以继承其他类。在 Swift 中,类通过 class 关键字进行定义。

class Person {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func sayHello() {
        print("Hello, my name is \(name)")
    }
}

结构体和类的区别

内存管理方式

结构体是值类型,它在被赋值给新的变量、函数参数传递或者在数组、字典中进行存储时,都会被复制一份。每份复制的结构体都是独立的,改动其中一份不会影响其他的副本。

而类是引用类型,它在被赋值给新的变量、函数参数传递或者在数组、字典中进行存储时,仅会复制一份引用。多个引用指向同一个实例,改动其中一个引用所指向的实例,会影响所有引用所指向的实例。

继承和类型转换

只有类能够继承其他类。通过继承,一个类可以获得父类的属性和方法,并且可以进行重写。可以使用 isas 运算符进行类型检查和类型转换。

与 Objective-C 的兼容性

结构体和类都可以在 Swift 和 Objective-C 之间进行无缝地转换与交互。但是,结构体的成员访问速度更快,并且在开发框架的公共 API 中更加推荐使用结构体。

什么时候使用结构体,什么时候使用类?

  • 当需要进行简单的值传递时,或者希望数据在传递时被复制,而不是引用时,应当使用结构体。
  • 当需要进行复杂的引用传递时,或者希望多个引用指向同一个实例时,应当使用类。
  • 当需要使用继承、类型转换或者判断对象的类型时,应当使用类。

示例

结构体示例

struct Rectangle {
    var width: Int
    var height: Int
    
    var area: Int {
        return width * height
    }
    
    mutating func doubleSize() {
        width *= 2
        height *= 2
    }
}

var rect = Rectangle(width: 10, height: 5)
rect.doubleSize()
print(rect.area) // 输出:100

类示例

class Car {
    var brand: String
    
    init(brand: String) {
        self.brand = brand
    }
    
    func startEngine() {
        print("Starting the engine of \(brand)")
    }
}

let myCar = Car(brand: "Tesla")
myCar.startEngine() // 输出:Starting the engine of Tesla

在上面的示例中,我们使用结构体定义了一个矩形的类型,并实现了计算矩形面积和双倍尺寸的方法。然后,我们使用类定义了一个汽车的类型,并实现了启动引擎的方法。

总结

结构体和类是 Swift 中用于创建自定义数据类型的两种方式。结构体是值类型,类是引用类型。它们在内存管理方式、继承和类型转换、以及与 Objective-C 的兼容性上有所不同。在选择使用结构体或类时,需要根据具体的需求来决定。


全部评论: 0

    我有话说: